我正在阅读一个名为Frisby 教授的最充分的函数式编程指南的函数式编程教程,作者对其进行了介绍Hindley-Milner
和几个示例,其中一个是:
// reduce :: (b -> a -> b) -> b -> [a] -> b
var reduce = curry(function(f, x, xs) {
return xs.reduce(f, x);
});
的第一个参数reduce
是一个函数,它的类型签名是b -> a -> b
,这正是我不明白的部分。上面的代码是用 js 编写的,这意味着f
应该接受两个参数并返回一个,如下所示:
function f(b, a) {
return b + a;
}
因此,类型签名f
应该是(b, a) -> b
而不是b -> a -> b
,对吧?f
不应该是一阶函数(由 暗示b -> a -> b
),至少在 js 中不应该。
所以我的问题是,这是教程的错误吗?(b, a) -> b
如果是这样,在 Hindley-Milner中表示的正确方法是什么?