给出如下的高阶函数:
let call (f : unit -> 'a) = f()
另一个功能:
let incr i = i + 1
有没有办法将incr
传递给call
,而不使用lambda:(fun () -> incr 1)
?
显然,传递(incr 1)
不起作用,因为该功能随后“完全应用”。
修改
澄清一下:我想知道是否有办法来理解一个函数,使它成为一个函数:unit -> 'a
。
答案 0 :(得分: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))
答案 1 :(得分: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