在哪种情况下,我应该选择使用函数式编程语言而不是像C ++,C#或Java这样更详细的面向对象语言?
我理解功能编程是什么,我真正理解的是什么类型的问题是一个完美的解决方案?
答案 0 :(得分:85)
我自己做了一些研究,并认为我可以将CONCURRENCY添加到使用函数式语言的原因列表中。在不久的将来看到处理器速度在某些时候将无法使用相同的CPU技术增加。架构的物理特性不允许它。
这就是并发处理的用武之地。
不幸的是,由于数据之间存在相互依赖关系,大多数OOP语言无法同时利用多个处理器。
在纯函数式编程语言中,计算机可以同时运行两个(或更多)函数,因为这些函数不会改变外部状态信息。
这是关于您可能喜欢的函数式编程的excellent article。
答案 1 :(得分:47)
在我看来,功能语言主要适用于两件事:游戏AI和数学计算。它在游戏AI中很好,因为它有很好的列表操作(至少在Lisp和Scheme中),并且由于它的语法而用于数学计算。 Scheme,Lisp和Haskell的语法使数学计算易于阅读。我要补充的最后一件事是功能语言真的很有趣。我的计划课程是我最有趣的课程之一。
答案 2 :(得分:13)
我的一位朋友引用他的一位大学教授的话说如下:
在顶部绘制一个包含数据类型的网格,在左侧绘制对这些数据类型的操作。如果你垂直切割网格,你就是做OO;如果你水平切割网格,你就是在做FP。
我的回答是FP是一种完全可行的编程方法,其应用范围与OO一样广泛。与任何编程语言选择讨论一样,我认为更重要的问题是:
答案 3 :(得分:10)
实际上你在PP中可以做的一切都可以在FP中完成,反之亦然。这只是另一种编码方式 - 对问题的另一种观点以及解决问题的另一种方式。
然而,由于没有多少人使用FP,问题更多的是缺乏良好的库,可移植性/可维护性(因为维护者有更好的机会理解用C ++编写的东西而不是Scheme),以及缺少文档和社区。我知道有一些文档,但是,将它与C ++,C#或Java进行比较,你会明白我的意思。
但是,如果你真的想做FP,你甚至可以在C ++和C#中使用这种风格。当然,如果您使用标准库,它将不是100%FP。不幸的是,我不认为C#被优化用于函数式编程,它可能会产生很多性能问题。
这是一个主观的帖子,我对FP的看法。这不是一个严格的声明。
答案 4 :(得分:4)
在很多情况下,功能语言都很好。它取决于特定功能语言的库。
您如何回答“何时使用面向对象编程语言?”这个问题?
答案 5 :(得分:3)
虽然这是一个非常主观的问题,但我想补充一点,函数式语言用于解析domain specific languages;功能性很好地解析了语法。
答案 6 :(得分:1)
从我所看到的,它更多的是品味而不是功能(没有双关语意)。在任何一种语言风格中都没有任何东西可以使它在特定任务中本身更好或更差。
答案 7 :(得分:1)
通常,使用最容易表达问题解决方案的语言。对于函数式编程,这是一个问题的解决方案很容易用函数表示,因此名称。通常它对数学运算,AI,模式匹配有好处;一般而言,任何可以分解为一组必须应用于获得答案的规则的东西。在充分分析问题后,您才能真正确定要使用的“最佳”语言。这就是伪代码派上用场的地方。如果您发现自己编写的FP代码看起来像FP,请使用FP。
当然,所有完整的编程语言在功能上都是等价的,因此根据您可以解决的问题确切选择哪一种。主要效果将是编码效率和准确性,以及易于维护。
另请注意,可以通过设计巧妙的API在OO语言中模仿FP。例如,我见过很多使用方法链来模拟FP DSL的Java库(JMock就是一个例子)。然后你会看到如下构造:
logger.expects(once()).method("error")
.with( and(stringContains(action),stringContains(cause)) );
这实质上构建了一个函数,该函数被计算以确定模拟对象上的某些调用序列是否正确。 (示例从http://www.jmock.org/yoga.html被盗)
其他OO语言中的另一种类似FP的语法是使用闭包,例如在Ruby中。
答案 8 :(得分:1)
我认为以前的帖子是正确的,这里是一个简短的列表,函数式编程是以下问题的完美解决方案: