2013-02-16 89 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