2011-02-09 125 views
1

我有一箇中期的下週即將到來,我只是在課堂上提供的sml筆記。我遇到了一個酷熱的例子,我不確定它是如何工作的。SML咖喱問題

這是一個簡單的函數,它計算一個數字的功能。下面是函數的定義:

fun pow 0 n = 1 | pow k n = n*pow(k-1)n 

我不知道,當我們把它傳遞以下參數此功能是如何工作的:

val x = pow 2 2 

這是我看到它的方式:

=2*pow(1)2 
=2*(2*pow(0)2)2 
=2*(2*(1)2)2) 

我們應該得到的結果是四個,但我沒有看到我們如何從上面執行的步驟中得到這個結果。

幫助請。謝謝。

+4

哇,誰投票結束了這個? 「無關」?真?也許我們只允許討論命令式語言? – jalf 2011-02-09 06:26:38

回答

2

啊,新澤西州的標準ML,怎麼我想念你...

無論如何,讓我一步一步來完成。請記住,咖喱,不像我面前的晚餐(偶然是咖喱菜),基本上是一次只處理一個參數以返回一個新功能的方式。考慮到這一點,將第一個2應用於給定的函數。由於只有一個模式匹配,你現在有一個新的功能 - 讓我們把它稱爲「咖喱」:

curry n = n * pow 1 n 

注意,你現在有pow函數來解決的「內部」版本。這樣做,再次,一個模式匹配。讓我們把這種內在的咖喱功能「米」:

rice n = n * pow 0 n 

還有一,「蝦米」 - 但是這一次,其他模式匹配:

shrimp n = 1 

遞歸在這裏結束,所以你有:

rice n = n * 1 
curry n = n * (n * 1) 

現在,在你原來的pow 2 2curry功能使用第二個2:

curry 2 = 2 * (2 * 1) 

這當然是4

我很懷疑SML名這樣的咖喱功能,但我希望這確實有助於理解這個概念。如果它也讓你感到飢餓,我不承擔任何責任。

1
2*pow(1)2 =2*(2*pow(0)2)2 

這裏展開pow 12 * pow 0 2和離開二是後。這是錯誤的。 pow 1自己將擴大到(fn n => n * pow 0 2),只有當它應用到第二個參數以及它將成爲2 * pow 0 2。所以上面應該閱讀:

2*pow(1)2 =2*(2*pow(0)2) 

現在,如果我們應用pow 0 2,我們得到1所以最後的結果是:

2*pow(1)2 = 2*(2*pow(0)2) = 2*(2*1) = 4