调整函数以获得另一个函数:unit - > '一个

时间:2011-02-17 15:55:27

标签: function f# currying

给出如下的高阶函数:

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

另一个功能:

let incr i = i + 1

有没有办法将incr传递给call,而不使用lambda:(fun () -> incr 1)

显然,传递(incr 1)不起作用,因为该功能随后“完全应用”。

修改

澄清一下:我想知道是否有办法来理解一个函数,使它成为一个函数:unit -> 'a

2 个答案:

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