2011-02-17 30 views
2

給定一個高階函數如下所示:鑽營一個函數來獲取另一個功能:單位 - >「一個

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

而另一功能:

let incr i = i + 1 

有沒有辦法通過incrcall,不使用lambda:(fun() -> incr 1)

顯然,通過(incr 1)不起作用,因爲該功能然後「完全應用」。

編輯

澄清:我不知道是否有討好的功能的方式,使得它成爲一個功能:unit -> 'a

+0

拉姆達是語法快捷方式。不知道你在這裏之後。順便說一句,是你的例子過度簡化了,還是'有趣() - > 2好嗎? – 2011-02-17 15:56:42

+0

我添加了一些澄清(希望)的問題。這個問題是關於一個特殊的柯式的例子。 – Daniel 2011-02-17 16:00:53

回答

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

它看起來更像是試圖給嚴格的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