什么时候你不想使用函数式编程?它不太擅长的是什么?
我更多的是寻找范型作为一个整体的缺点,而不是像“没有广泛使用”或“没有好的调试器可用”之类的东西。到目前为止,这些答案可能是正确的,但它们处理的是FP是一个新概念(一个不可避免的问题),而不是任何固有的品质。
相关信息:
发布于 2009-11-25 01:09:12
我很难想到函数式编程的许多缺点。话又说回来,我是函数式编程国际会议的前主席,所以你可以放心地认为我有偏见。
我认为主要的缺点与孤立和进入壁垒有关。学习编写好的函数式程序意味着要学会以不同的方式思考,而要做好这件事需要投入大量的时间和精力。没有老师是很难学习的。这些属性会导致一些缺点:
一般来说,专家编写快速的函数式程序没有困难;事实上,现在在8核和16核处理器上性能最好的一些并行程序都是用Haskell.
你不能很容易地与你的邻居交谈,这也是事实,因为函数式编程概念比Smalltalk、Ruby和C++等语言背后的面向对象概念更难教授和学习。而且,面向对象的社区已经花了几年的时间为他们所做的事情开发了很好的解释,而函数式编程社区似乎认为他们的东西显然很棒,不需要任何特殊的隐喻或词汇来解释。(他们错了。我仍然在等待第一本伟大的书“功能设计模式”( functional Design Pattern)。
发布于 2009-11-24 09:13:33
函数式编程的一大缺点是,从理论上讲,它与硬件和大多数命令式语言都不匹配。(这是其明显优势之一的另一面,能够表达您想要做的事情,而不是您希望计算机如何做。)
例如,函数式编程大量使用递归。这在纯lambda演算中很好,因为数学的“堆栈”是无限的。当然,在真实的硬件上,堆栈是非常有限的。在大型数据集上天真地递归可能会使您的程序变得繁荣。大多数函数式语言都会优化尾递归以避免这种情况发生,但是让算法尾递归可能会迫使你做一些相当不美观的代码体操(例如,尾递归映射函数创建一个向后列表或必须构建一个差异列表,所以它必须做额外的工作才能以正确的顺序返回到正常的映射列表,而不是非尾递归版本)。
(感谢Jared Updike的差异列表建议。)
发布于 2009-11-24 08:14:52
如果你的语言没有提供良好的机制来通过你的程序检测状态/异常行为(例如,一元绑定的语法糖),那么任何涉及状态/异常的任务都会成为一件苦差事。(即使有了这些糖,有些人可能会发现更难处理FP中的状态/异常。)
函数式习惯用法通常会造成大量的控制反转或懒惰,这通常会对调试(使用调试器)产生负面影响。(由于不可变性/引用透明性,FP不太容易出错,这在一定程度上抵消了这一点,这意味着您将不需要经常调试。)
https://stackoverflow.com/questions/1786969
复制相似问题