F# で文芸的なプログラミング (つまり cweb) を使用するには、関数を前方宣言できるようにする必要があります (つまり、関数を定義する前に使用します)。私は 2 つの方法を思いつきましたが、どちらも不快でした。もっと良いもの (プログラマにとって使いやすいもの) を考えられますか?
素晴らしいですが、多相関数では機能しません
// This can be ugly
let declare<'a> = ref Unchecked.defaultof<'a>
// This has to be beautiful
let add = declare<float -> float>
let ``function I want to explain that depends on add`` nums = nums |> Seq.map !add
add := fun x -> x + 1.
醜いが、すべてで動作する
// This can be ugly
type Literate() =
static member Declare<'a, 'b> (ref : obj ref) (x : 'a) : 'b =
unbox <| (unbox<obj -> obj> !ref)
static member Define<'a, 'b> (func : 'a -> 'b) (ref : obj ref) (f : 'a -> 'b) =
ref := box (unbox<'a> >> f >> box)
// This has to be beautiful
let rec id (x : 'a) : 'a = Literate.Declare idImpl x
and idImpl = ref null
let f () = id 100 + id 200
Literate.Define id idImpl (fun x -> x)