将函数式编程原理应用于Javascript是一个非常可行的选择吗?

时间:2014-03-29 16:32:29

标签: javascript functional-programming

我来自Haskell的背景。我非常习惯用递归函数和典型的高阶函数(折叠,映射,滤波器等)和组合函数来完成任务。我现在正在开发node.js,我很想写自己的模块来实现这些函数,所以我可以在我的代码中以对我有意义的方式使用它们。

我的问题是,基本上:是否设置了Javascript来处理这种负担?我知道上述递归函数可以很容易地重构为迭代函数,但我经常发现自己在函数中调用了很多函数,我不知道Javascript是否可以很好地处理这类事情。我知道像Underscore这样的东西存在并实现了一些FP原则,但我的问题基本上归结为:在Javascript中进行功能编程是一种好习惯吗?如果没有,为什么不呢?

如果这个问题对于SO来说有点过于软弱,我也很抱歉,但是我不想开始把我自己的工具集放在一起,如果它只是在它变得太大时就会破坏它。

1 个答案:

答案 0 :(得分:4)

在我看来,对你的问题的简短回答是肯定的 - 在Javascript中应用函数式编程原则是可行的! (我相信大多数其他语言也是如此 - 应用FP原则通常可以获得一些东西)。

Here's我在Javascript中构建的函数解析器组合库的示例。 (here它正在行动中)。功能是很重要的,因为:1)它允许我通过组合构建解析器,这意味着我可以独立构建和测试小解析器,然后将它们放在一起并确信行为将是相同的,并且2)它使回溯超级易于获得(这很重要,因为选择运算符在替代方案失败时回溯)。

所以这些是FP原则(请注意,这个列表中没有递归,折叠,贴图和过滤器),我发现它在构建我的库时非常有用:

  • 避免可变状态
  • 纯函数(即输出仅取决于输入)
  • 组成:通过将简单的部分粘合在一起来构建复杂的应用程序

由于Javascript的支持,在Javascript中应用这些通常非常容易和愉快:

  • 一流的功能
  • 匿名函数
  • lexical closures

但这里有一些值得注意的事项:

  • 缺乏有效的功能数据结构的流行库
  • 缺乏尾调用优化(至少目前)
  • 部分应用程序比Haskell
  • 更具语法重要性
  • 许多流行的图书馆都不是特别实用
  • DOM不起作用(按设计)

然而,你的最后一条评论 - “我不想开始把我自己的工具集放在一起,如果一旦它变得太大就会打破一切” - 这是一个很好的评论。对于每种方法来说,这基本上都是一个问题,我无法告诉你,当事情变得太大时,Javascript中的FP是否比“主流”技术更有问题。但我可以告诉你,根据我的经验,Javascript中的FP可以帮助我防止事情变得太大。