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功能。要評估它,你必須給它的論點,其中包括x
和y
。在這種情況下,將評估爲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
。
希望這會澄清一點。
我仍然不清楚如何將它應用於我的問題。我必須創建多個功能? – user2796815
是的,在curried函數中的模式匹配可以完全按照與noncurried函數相同的方式完成。 (另外請注意,它們被稱爲curried函數,而不是咖喱函數)。 – qaphla
@qaphla如何爲您的示例'fun add x y'明確指定類型。例如,我希望'x'和'y'是真實的,並且在函數中我在求和之前將它們四捨五入,並且'add'函數返回一個int。 –