给定 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
接收两个输入。
给定 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
接收两个输入。
由于柯里化,这个函数(以及 SML 中的任何函数)实际上是接收一个输入。
从技术上讲,有一个函数接受单位,它返回接受 'a 的函数,它返回接受 int 的函数。
所以
fun foo a b = a + b;
只是一个语法糖
fun foo a = fn b => a + b;
等等。
如果您将函数定义为,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 ()
。