2

我正在尝试学习 SML,我的一些教授笔记谈到了map“类型为 ('a -> 'b) -> ('a list -> 'b list)”的函数。他继续解释说,这意味着“你给我一个函数,将 'as 转换为 'b s...”。

但是,他的实现看起来像:

fun map f [] = []
  | map f (a::l) = (f a)::(map f l)

在我看来,这相当于 2 个参数(我知道 sml 中的所有内容在技术上只需要一个参数,但使用元组或柯里化它看起来像 2)。看来它正在使用一个函数和一个列表。但是,上面的解释听起来好像它只是一个函数。我错过了什么?

4

1 回答 1

4

正如您自己所说,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调用,然后调用由mapwithmy_list作为其参数重新调整的函数。

这就是柯里化的全部意义所在。

于 2013-01-21T17:26:59.467 回答