2

给定一个高阶函数,如下所示:

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

还有另一个功能:

let incr i = i + 1

有没有办法在不使用 lambda:的情况下传递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

不确定它是否比显式 lambda 更好,但仍然:

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 回答