2

次のような高階関数があるとします。

let call (f : unit -> 'a) = f()

そして別の機能:

let incr i = i + 1

ラムダを使用せずincrに、に渡す方法はありますか?call(fun () -> incr 1)

明らかに、関数が「完全に適用」されるため、受け渡し(incr 1)は機能しません。

編集

明確にするために:私はそれが関数になるように関数をカレーする方法があるかどうか疑問に思っています:unit -> 'a

4

2 に答える 2

2

このようなショートカットは自分で定義できます。

let ap f x = fun () -> f x

call (ap incr 1)

変換する関数が純粋関数である場合は、代わりに定数関数を定義できます。

let ct x _ = x  (* const is reserved for future use :( *)

call (ct (incr 1))
于 2011-02-17T16:05:31.167 に答える
1

厳密なF#に怠惰を加えてから、ある種のカリー化を試みるように見えます。実際、F#にはそのための組み込み機能があります:http://msdn.microsoft.com/en-us/library/dd233247.aspx-キーワードlazyと厄介なForce

明示的なラムダよりも優れているかどうかはわかりませんが、それでも:

let incr i = 
    printf "incr is called with %i\n" i
    i+1

let call (f : unit -> 'a) =
    printf "call is called\n"
    f()

let r = call <| (lazy incr 5).Force

printf "%A\n" r
于 2011-02-17T21:28:46.350 に答える