【发布时间】:2021-07-09 01:23:07
【问题描述】:
我正在阅读一个名为Professor Frisby's Mostly Adequate Guide to Functional Programming的函数式编程教程,作者对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 中不是。
所以我的问题是,这是教程的错误吗?如果是这样,在 Hindley-Milner 中表示 (b, a) -> b 的正确方法是什么?
【问题讨论】:
-
元组是表示多个参数的正确方法。是的,这看起来像是教程中的一个错误/失误——在函数式编程中,函数通常是 curried,而在 javascript 中则不是。
-
本教程使用的是lodash curry,所以我相信curried符号是指curry的“curriable”输出,即如果
f(b, a) = b + a,那么curry(f)(b)(a) = b + a -
@chiliNUT 但是
f不是(不应该)咖喱,只有reduce是。
标签: javascript types functional-programming hindley-milner