【发布时间】:2015-10-06 13:15:31
【问题描述】:
我正在阅读 Harper 的书《标准机器学习简介》,对第 11.3 节“返回函数”有点困惑。
1) 他定义了一个创建常量函数的函数。他写道:
“给定一个值 k,应用程序 constantly k 产生一个函数,该函数在应用它时产生 k。这是 constantly 的定义:
val constantly = fn k => (fn a => k)
该函数始终具有 'a -> ('b -> 'a) 类型。” 这对我来说很有意义:您提供一个类型为 'a 的值,它返回一个始终返回该值的函数(类型为 'a),而不管输入( type 'b,可能与 type 'a) 相同,也可能不同。
然后他说我们也可以将这个函数定义为:
fun constantly k a = k
这看起来就像一个接受两个参数并返回第一个参数的函数......但不是一个返回另一个函数的函数......
我错过了什么?
2) 稍后,Harper 讨论了 map 函数。我了解基本的地图功能。然后他谈到了一个 map 函数,它可以让我们将传入的函数应用于许多列表(而不是多次调用我们的原始 map 函数,每次调用都使用相同的传入函数)。他写道:
fun map' f nil = nil
| map' f (h::t) = (f h) :: (map' f t)
“如此定义的函数映射的类型为('a -> 'b) -> 'a list -> 'b list。它以'a -> 'b 类型的函数作为参数,并产生另一个'a list -> 'b list 类型的函数作为结果。”
我在这里很迷茫,因为它看起来像 map' 只是将 f 应用于列表中的所有元素并返回结果列表。所以我会认为它是类型:
('a -> 'b) * 'a list -> 'b list
我哪里错了?
感谢您的帮助, 布莱曼
【问题讨论】:
-
查看我的这个答案,看看它是否可以帮助您找到原因。 stackoverflow.com/questions/29091328/…如果没有,请告诉我,我也会在这里回复。
标签: functional-programming sml