我有兩個類型的問題int - >(int - > int)和(int - > int) - > int。這兩者有什麼區別?Curried函數f#
我在這裏讀到的地方,第一個可以被解釋爲一個函數,它接受一個int並返回一個函數,該函數接受和int並返回一個int,它與int - > int - > int相同。這是正確的嗎?
我有兩個類型的問題int - >(int - > int)和(int - > int) - > int。這兩者有什麼區別?Curried函數f#
我在這裏讀到的地方,第一個可以被解釋爲一個函數,它接受一個int並返回一個函數,該函數接受和int並返回一個int,它與int - > int - > int相同。這是正確的嗎?
int -> (int -> int)
和int -> int -> int
之間的差別可以忽略不計(如果你要我,你會真正關心與另一種語言結合)。這些是curried函數,它們有效地使用兩個整數並返回一個整數(例如,內置的加法運算符具有這些行的類型)。
但是,這兩個都與(int -> int) -> int
大不相同,它將函數從整數轉換爲整數並返回一個整數。正如其他人所提到的,這種功能的唯一簡單例子就是將給定的函數應用於特定的值(例如fun (f:int->int) -> f 13
)。
我真的不知道F#,但它看起來很直觀(許多其他語言都有相同的概念)。
第一種會有點像咖喱功能。
所以讓我們看看會是什麼樣實現比如:
第一
let func1 i = fun j -> i+j
這有int -> (int -> int)
音符的簽名func1 2 3
不應該工作
編輯:事實證明,由於聯繫性的工作方式,這就是交流tually精細
但這是
let func2 i j= i+j
其中有一個類型的int -> int -> int
這裏func2 1 2
不同的是罰款
另一個例子中,我們可以建立這樣的:
let func4 a = a 1
這將有一個簽名('t->int) -> u
採摘混凝土a
將工作。請注意,func4 1 2
絕對不會編譯
'func1 2 3' * does * work。不需要編譯器,你可以使用http://tryfs.net或http://ideone.com/ :) – 2012-02-22 05:33:30
我相信有一個錯誤。 Func1 2 3應該評估爲5,因爲它與(fun1 2)3相同。此外,由於 - >右側相關,int - >(int - > int)和int - > int - > int之間沒有區別 – user1072706 2012-02-22 05:34:05
@MauricioScheffer,user1072706 - 感謝您的更正 - 回答更新 – 2012-02-22 08:38:11
好問題,我懷疑功能上沒有太大的區別。我花了一段時間試圖弄清楚如何獲得這兩個簽名。 (約翰·帕爾默的let fun1 i = fun j -> i + j
只是給int -> int -> int
對我來說)
let add a b = a + b // int -> int -> int
let inc a = add a // int -> (int -> int)
我想不出一個非人爲的例子的第二簽名:
let foo fn : int -> fn 1 // (int -> int) -> int
(這並不直接回答你的問題,但可能給別人的東西來啃)
您可以給第二種類型的例子? – user1072706 2012-02-22 23:28:12
@ user1072706 - 正如我在我的回答中提到的,「fun(f:int-> int) - > f 13'就是這樣一個例子。 – kvb 2012-02-23 03:02:46