1
我正在學習使用SML語言的函數式編程。在閱讀我的學習筆記時,我遇到了一個問題,即詢問哪種功能(斑點或咖喱)更快。SML/NJ中的斑點函數與咖喱函數性能的比較
我看過視頻here,其中的老師說這是語言實現的問題,並陳述(在5:25)SML/NJ使用斑點函數執行更快,但沒有說明爲什麼是。
我想我的導師曾經說過,這是因爲curried函數創造了更多閉包,但我認爲我沒聽錯。
有人可以詳細說明嗎?
我正在學習使用SML語言的函數式編程。在閱讀我的學習筆記時,我遇到了一個問題,即詢問哪種功能(斑點或咖喱)更快。SML/NJ中的斑點函數與咖喱函數性能的比較
我看過視頻here,其中的老師說這是語言實現的問題,並陳述(在5:25)SML/NJ使用斑點函數執行更快,但沒有說明爲什麼是。
我想我的導師曾經說過,這是因爲curried函數創造了更多閉包,但我認爲我沒聽錯。
有人可以詳細說明嗎?
還有一些咖喱功能的中間評估。假設我們想要一個函數來計算三個數字。我們考慮以下兩個定義:
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
所以還有一些額外的步驟。但是,它肯定不會導致程序中的性能問題。