2011-07-30 62 views
2

下面是我從這個電子書(http://www.cs.cornell.edu/riccardo/prog-smlnj/notes-011001.pdf)需要幫助理解討好

-fun curry (f:'a * 'b -> 'c) = fn (x:'a) => fn (y:'b) => f (x,y); 
val curry = fn : ('a * 'b -> 'c) -> 'a -> 'b -> 'c 

如何拿起一個例子我是否解釋這個函數?咖喱作爲一個函數f的類型'a *'b - >'c的參數。我無法理解'='之後的部分。關聯性命令是什麼?

下面是另一個例子:

fun add’ (x:int) (y:int):int = x + y; 

這是如何解析?

Wikipedia說「currying是一種轉換函數的技術,它可以將多個參數(或n元組參數)轉換爲一個函數鏈,每個函數都有一個參數(部分應用程序)」。哪一個是唯一的參數:多個參數中的第一個或最後一個?

+0

我不得不在Haskell同樣的問題所得到的函數。因此,這可以幫助你http://stackoverflow.com/questions/3794371/haskell-currying-need-further-explanation – Matt

+0

@馬特:我讀它:)感謝您的鏈接後雖然得到了更多的困惑。 – Bruce

回答

2

fn (x:'a) => fn (y:'b) => f (x,y)被解析爲fn (x:'a) => (fn (y:'b) => f (x,y))。所以你有一個函數,它接受一個類型爲a的參數x並返回另一個函數,它接受一個類型爲b的參數y。這個函數然後返回調用f (x,y)的結果。

fun foo x y = ...val foo = fn x => fn y => ...的語法糖,因此foo是一個函數,它接受一個參數x並返回另一個函數,該函數接受一個參數y。

類似地,呼叫foo 1 2將被解析爲(foo 1) 2,即它調用用參數1的功能foo,然後調用用參數2

+0

@ sepp2k:我剛剛開始使用SML。你能否建議一個我可以使用的好資源(書籍,在線資料)。 – Bruce