【发布时间】:2016-03-15 20:16:32
【问题描述】:
寻找 Javascript 函数式编程中柯里化的好处我遇到了以下 Haskell 示例:
(.) :: (b -> c) -> (a -> b) -> a -> c
据说类型变量c可以是一个函数类型,这样这个函数就可以在其参数的参数列表的某个前缀上工作。我不知道 Haskell,但这显然只是函数组合。在这种情况下,抽象优于 arity 意味着什么?它在什么方面具有优势?有人可以通过使用 Javascript 示例向我简要解释一下吗?
【问题讨论】:
-
在 javascript 中你会有类似的东西:
function compose(f, g) {function h(x) {return f(g(x))}; return h;}。注意h有一个参数。要组合具有不同数量参数的函数,您必须编写多个compose函数。在 Haskell 中,您可以免费获得。在 python 中,您可以这样做:def compose(f, g): return lambda x, *args: f(g(x), *args)以获得相同的效果。不知道这是否可以在 javascript 中完成。 -
@Bakuriu,它可以在 JavaScript 中完成(它的
function关键字本质上是一个 lambda 形式)。编写和使用此类函数的语法开销令人望而却步。并且在没有静态类型的情况下处理不可避免的 arity 错误是很痛苦的。而且我认为您可能会为此付出高昂的效率代价。 -
@dfeuer @Bakuriu 所以这只是意味着currying允许组合n元函数吗?
const comp = f => g => x => f(g(x)); const comp2 = comp(comp)(comp); const add = x => y => x + y; comp2(add)(add)(1)(2)(3); -
啊,看来语法开销已经减少了!尽管如此,没有静态类型会使这种事情变得有点棘手。定义多参数函数以采用逗号分隔样式的文化往往会使泛型组合器在实践中使用起来很烦人,并带有很多
curry/uncurry之类的噪音。 -
@dfeuer 是的,因此每个函数都必须经过几十个单元测试。这就是缺少类型系统/编译器所要付出的代价。