2013-02-16 88 views
0

不清楚鑑於SML以下功能:功能的數據類型是SML

fun i a b = let fun j()=a+1 in j end; 

函數的數據類型是:

val i = fn : int -> 'a -> unit -> int 

我不明白爲什麼int -> 'a -> unit -> int

爲什麼不是(int * a') -> unit -> int,因爲功能i接收到兩個輸入。

+2

也許[this](http://stackoverflow.com/questions/14550740/sml-why-functions-always-take-one-argument-make-language-flexible/14554122#14554122),[this](http ://stackoverflow.com/questions/14432696/what-does-this-function-signature-mean-in-sml/14438864#14438864)和[this](http://stackoverflow.com/questions/8395564/what-咖喱和 - 高級函數 - 毫升/ 8400194#8400194)會啓發你多一點咖喱? – 2013-02-16 23:01:28

回答

2

如果將函數定義爲fun i (a,b) = ...,那麼它將需要一個元組作爲參數,其類型確實是(int * 'a) -> unit -> int。它將被稱爲i (23,42)()(23,42)是一個元組,()是單位值)。

但是,您將其定義爲fun i a b = ...,它定義了一個函數,該函數接受一個參數,然後返回接受下一個參數的另一個函數。這是fun i a = fn b => ...的快捷方式。它可以被稱爲i a b()

2

這個功能(以及SML中的任何功能)實際上都是接收的一個輸入,因爲是currying。

從技術上講,有函數需要單位,即返回帶有返回函數的函數。

所以

fun foo a b = a + b; 

just an syntactic sugar

fun foo a = fn b => a + b; 

等。

+1

捲曲,不攜帶。 ;) – 2013-02-17 16:11:08

+1

@AndreasRossberg我希望先生。哈斯克爾會原諒我;-) – 2013-02-17 20:00:47