2010-03-13 77 views
15

我有以下的功能和它的工作原理:令行禁止匿名函數在SML

(fn x => x * 2) 2; 

但這個不起作用:

(fn x y => x + y) 2 3; 

誰能告訴我爲什麼?或者給我一些提示讓它起作用?

+0

當我改變爲這個 (fn(x,y)=> x + y)(2,3); 但爲什麼(fn x y => x * y)2 3;產生一個錯誤 – jjennifer 2010-03-13 02:23:42

回答

30

(fn x => fn y => x+y) 2 3;工程。 fn根本沒有相同的語法糖來定義fun具有的咖喱味函數。

0

在標準ML,函數只能有一個參數,所以使用

(fn (x,y) => x + y) (2,3) 

和類型是

fn: int * int -> int 

在這個時間(X,Y)和(2, 3)是一個列表結構,

+0

,但它將它更改爲uncurried函數,這是不同的 – newacct 2014-02-10 09:19:53

+0

哦,currying!對不起,我沒有發現問題,sepp2k的答案很好。 – Waverim 2014-02-11 12:04:31

+0

另外,(2,3)不是一個列表結構是一個int * int類型的元組,它不同於類型爲int的列表,它將是[2,3]的類型。 – Mateo 2017-04-25 19:54:59

0

上面貼出的答案是正確的。 SML函數僅需一個參數。其結果是,SML函數可以僅具有兩個輸入類型之一:

1)t = (t1 * t2 * ... * tN),對於在某些N

2)t = a,對於一些a

所以,從技術上來說,SML 只有以產品類型一元類型作爲參數傳遞給函數。人們可以更普遍地認爲這是一種一元類型或某種產品類型的投影。

爲了有譁衆取寵匿名功能,可隨時將其嵌套對方內線爲: fn x1 => fn x2 => ... fn xN => ...

我認爲這是同樣重要的是知道: fun a = fn x1 => fn x2 => ... fn xN => ...是較好語法充分擴張:fun a x1 x2 .. xN