1

给定 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接收两个输入。

4

2 回答 2

2

由于柯里化,这个函数(以及 SML 中的任何函数)实际上是接收一个输入。

从技术上讲,有一个函数接受单位,它返回接受 'a 的函数,它返回接受 int 的函数。

所以

fun foo a b = a + b;

只是一个语法糖

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

等等。

于 2013-02-16T22:39:05.857 回答
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 ()

于 2013-02-16T22:40:37.747 回答