2014-01-30 56 views
1

我正在學習使用SML語言的函數式編程。在閱讀我的學習筆記時,我遇到了一個問題,即詢問哪種功能(斑點或咖喱)更快。SML/NJ中的斑點函數與咖喱函數性能的比較

我看過視頻here,其中的老師說這是語言實現的問題,並陳述(在5:25)SML/NJ使用斑點函數執行更快,但沒有說明爲什麼是。

我想我的導師曾經說過,這是因爲curried函數創造了更多閉包,但我認爲我沒聽錯。

有人可以詳細說明嗎?

回答

1

還有一些咖喱功能的中間評估。假設我們想要一個函數來計算三個數字。我們考慮以下兩個定義:

fun sum (x,y,z) = x + y + z 

另外,

fun sum x y z = x + y + z 

考慮的第一個版本如下粗略評估跟蹤:

:> sum(1,2,3) 
    1 + 2 + 3 (substitution using pattern matching on the contents of the tuple) 
    (1 + 2) + 3 
    3 + 3 
    6 

在另一方面,與咖喱版本SML會在評估表達式時即時構建一些匿名函數。這是因爲curried函數利用了匿名函數可以作爲其他函數的結果返回的事實,以捕獲將多個參數應用於單個函數的行爲。構造這些函數需要一定的時間。

:> sum 1 2 3 
    ((sum 1) 2) 3 
    (((fn x => (fn y => (fn z => x + y + z))) 1) 2) 3 
    ((fn y => (fn z => 1 + y + z)) 2) 3 
    (fn z => 1 + 2 + z) 3 
    1 + 2 + 3 
    (1 + 2) + 3 
    3 + 3 
    6 

所以還有一些額外的步驟。但是,它肯定不會導致程序中的性能問題。