2012-02-22 87 views
1

我有兩個類型的問題int - >(int - > int)和(int - > int) - > int。這兩者有什麼區別?Curried函數f#

我在這裏讀到的地方,第一個可以被解釋爲一個函數,它接受一個int並返回一個函數,該函數接受和int並返回一個int,它與int - > int - > int相同。這是正確的嗎?

回答

3

int -> (int -> int)int -> int -> int之間的差別可以忽略不計(如果你要我,你會真正關心與另一種語言結合)。這些是curried函數,它們有效地使用兩個整數並返回一個整數(例如,內置的加法運算符具有這些行的類型)。

但是,這兩個都與(int -> int) -> int大不相同,它將函數從整數轉換爲整數並返回一個整數。正如其他人所提到的,這種功能的唯一簡單例子就是將給定的函數應用於特定的值(例如fun (f:int->int) -> f 13)。

+0

您可以給第二種類型的例子? – user1072706 2012-02-22 23:28:12

+0

@ user1072706 - 正如我在我的回答中提到的,「fun(f:int-> int) - > f 13'就是這樣一個例子。 – kvb 2012-02-23 03:02:46

2

我真的不知道F#,但它看起來很直觀(許多其他語言都有相同的概念)。

  1. 是一個函數取一個整數,並返回一個函數,它接受一個int並返回一個int
  2. 是一個函數,利用函數接受一個int並返回一個int,並返回一個int

第一種會有點像咖喱功能。

0

所以讓我們看看會是什麼樣實現比如:

第一

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絕對不會編譯

+2

'func1 2 3' * does * work。不需要編譯器,你可以使用http://tryfs.net或http://ideone.com/ :) – 2012-02-22 05:33:30

+1

我相信有一個錯誤。 Func1 2 3應該評估爲5,因爲它與(fun1 2)3相同。此外,由於 - >右側相關,int - >(int - > int)和int - > int - > int之間沒有區別 – user1072706 2012-02-22 05:34:05

+0

@MauricioScheffer,user1072706 - 感謝您的更正 - 回答更新 – 2012-02-22 08:38:11

3

好問題,我懷疑功能上沒有太大的區別。我花了一段時間試圖弄清楚如何獲得這兩個簽名。 (約翰·帕爾默的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 

(這並不直接回答你的問題,但可能給別人的東西來啃)