正如您自己所说,SML 并没有真正的多元函数,它只模拟使用元组或柯里化。在这种情况下map
是一个柯里化函数。您的教授声明有意义的原因是,柯里化函数只是一个接受一个参数并返回一个接受下一个参数的函数的函数。
看到这一点的一种方法是fun
根据val
. 一般fun f x y = bla
相当于val rec f = fn x => fn y => bla
。所以 的定义map
等价地可以写成这样:
val rec map = fn f => fn as => case as of
[] => []
| (a::l) => (f a)::(map f l)
查看该定义很明显,第一个fn
创建了一个返回另一个函数的函数(第二个fn
)。
map
我们还可以通过观察只使用一个参数调用是合法的并且结果是一个函数来看到这种情况:
val my_map = map my_function
val mapped_list = my_map my_list
在上面my_map my_list
等价于map my_function my_list
。这向我们展示了调用map my_function my_list
((map my_function) my_list
由于函数应用程序是左关联的)只是简单地map
使用参数my_function
调用,然后调用由map
withmy_list
作为其参数重新调整的函数。
这就是柯里化的全部意义所在。