5

簡単な関数の値を考えてみましょうf1:

let f1 = printfn "*bind f1*"; fun () -> printfn "f1()"

f1としてFSIに結合します

*bind f1*
val f1 : (unit -> unit)

そして、呼び出されると、期待どおりに動作します

> () |> f1 |> f1;;
f1()
f1()
val it : unit = ()

次に、同様の関数値を取りますが、明示的にジェネリックにしf2<'a>ます:

let f2<'a> = printfn "*bind f2*"; fun () -> printfn "f2()"

f2としてFSIに結合します

val f2<'a> : (unit -> unit)

出力はまったくありませんが、呼び出されると、呼び出し*bind f2*ごとに出力されます。f2

> () |> f2 |> f2;;
*bind f2*
f2()
*bind f2*
f2()
val it : unit = ()

私の質問は、このように観察された不均衡の原因は何でしょうか?

4

2 に答える 2

2

いつものように、トーマスは正しいです。と同じように動作するジェネリック関数を作成できますがf1、種類のキャッシュとしてノミナル ジェネリック型を使用する必要があることに注意してください。

type private Container<'a> () =
    static member val f2 : unit -> unit = printfn "*bind f2*"; fun () -> printfn "f2()"

let f2<'a>() = Container<'a>.f2()
于 2013-10-28T15:07:47.653 に答える