我来自Haskell的背景。我非常习惯使用递归函数和典型的高阶函数(折叠,地图,过滤器等)来完成工作,并将函数组合在一起。我现在正在使用node.js进行开发,因此我很想编写自己的模块来实现这些功能,因此我可以以对我有意义的方式在代码中使用它们。

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

如果这个问题对SO来说太软了,我也表示歉意,但是如果它一旦太大就会破坏一切,我不想开始整理我自己的工具集。

最佳答案

我认为,您的问题的简短答案是肯定的-在Javascript中应用函数式编程原理是可行的! (我相信大多数其他语言也是如此-应用FP原则通常会有所收获)。

Here's我用Javascript构建的功能解析器组合器库的示例。 (并且here它正在起作用)。发挥功能非常重要,因为:1)它允许我按组成来构建解析器,这意味着我可以独立构建和测试小型解析器,然后将它们放在一起并确信其行为将是相同的,以及2)它使回溯超级容易解决(这很重要,因为选择操作符在替代方法失败时会回溯)。

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


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


由于Javascript支持以下内容,因此在Javascript中应用这些代码通常非常容易且令人愉快。


一流的功能
匿名功能
词汇闭包


但是这里有一些注意事项:


缺乏流行的有效功能数据结构库
缺乏尾声优化(至少目前是这样)
与Haskell相比,部分应用程序的语法负担更大
许多流行的库不是特别有用
DOM不起作用(通过设计)


但是,您最后的评论-“我不想开始组装我自己的工具集,如果它一旦太大就会破坏所有东西的话” –是很好的。这基本上是每种方法都存在的问题,并且当事情变得太大时,我无法告诉您Java脚本中的FP是否比“主流”技术有更多问题。但是我可以告诉你,根据我的经验,Java脚本中的FP可以帮助我防止事情变得太大。

09-30 16:14
查看更多