2013-09-24 113 views
3

通常我們感興趣的是計算f(i)i = mnΣ,函數 的值f(i)對於i = m到n的和。定義'sigma f m n'計算 f(i)i = mnΣ。這與'sigma(f,m,n)'的定義不同咖喱功能故障(SML/NJ)

我需要編寫此函數的Curried版本。我在理解這將如何工作方面遇到了一些麻煩。我知道Curry函數是一個函數併產生一個函數的東西。這是一個咖喱功能的例子嗎?

fun myCurry f x = f(x) 

至於設置我的問題,這是一個可以接受的開始?

fun sigma f m n = 

我還沒有得到任何進一步的,因爲我不能真正瞭解我被要求做什麼。

回答

7

curried函數實際上不是一個函數,它接受函數併產生另一個函數。這是一個更高階的函數。

curried函數只是一個需要多個參數的函數,可以通過只給出它的一個參數來部分應用。

例如,你的西格瑪問題,

fun sigma (f,m,n) = ... 

不是令行禁止的功能,因爲它只有一個參數(元組(f,m,n)。)

fun sigma f m n = ... 

,但是,是一個令行禁止函數,因爲它需要三個參數,並且它是有效的說類似於

val sigmasquare = sigma (fn x => x * x) 

,通過給它第一個參數部分申請西格瑪。

一個更簡單的例子是

fun add (x,y) = x + y 

這是一個noncurried功能。要評估它,你必須給它的論點,其中包括xy。在這種情況下,將評估爲8。

fun add x y = x + y 

是這個相同函數的curried版本。這可以通過給它x進行部分評估。例如,add 3將評估爲一個函數,該函數將爲其參數添加三個。

通過將前面的例子看作匿名函數或lambda函數,可以更清楚地看出這一點。

第一個相當於fn (x,y) => x + y,這明顯需要兩個整數並評估爲int。

第二個相當於fn x => fn y => x + y,它接受一個int並計算一個採用另一個int並計算爲int的函數。

因此,第一種的類型是(int * int) -> int,而第二種的類型是int -> int -> int

希望這會澄清一點。

+0

我仍然不清楚如何將它應用於我的問題。我必須創建多個功能? – user2796815

+0

是的,在curried函數中的模式匹配可以完全按照與noncurried函數相同的方式完成。 (另外請注意,它們被稱爲curried函數,而不是咖喱函數)。 – qaphla

+0

@qaphla如何爲您的示例'fun add x y'明確指定類型。例如,我希望'x'和'y'是真實的,並且在函數中我在求和之前將它們四捨五入,並且'add'函數返回一個int。 –