在哪种情况下,我应该选择使用功能性编程语言,而不是使用更冗长的面向对象语言(例如C ++,C#或Java)?
我了解什么是函数编程,而我真正不了解的是针对什么类型的问题,这是一个完美的解决方案吗?
Answers:
在我看来,功能语言主要有两点好处:游戏AI和数学计算。由于其良好的列表操作(至少在Lisp和Scheme中),因此在游戏AI中是好的,并且由于其语法而在数学计算中也是如此。Scheme,Lisp和Haskell的语法使数学计算易于阅读。我要补充的最后一件事是功能语言是非常有趣的语言。我的计划课程是我最喜欢的课程之一。
我本人对此进行了一些研究,并认为我可以在使用功能性语言的原因列表中增加共识性。看到在不久的将来,使用相同的cpu技术将无法提高处理器速度。该架构的物理原理是不允许的。
这就是并发处理进入的地方。
不幸的是,由于数据之间的相互依赖性,大多数OOP语言不能一次利用多个处理器。
在纯函数式编程语言中,计算机可以一次运行两个(或更多)功能,因为这些功能不会改变外部状态信息。
这是您可能喜欢的有关函数式编程的出色文章。
我的一个朋友引用他的一位大学教授的话说:
在顶部绘制一个网格,其数据类型在左侧,而对这些数据类型的操作则在左侧。如果垂直分割网格,则表示正在执行OO;否则,请执行以下步骤。如果将网格水平切片,则说明您正在执行FP。
我的回答是,FP是一种完全可行的编程方法,具有与OO一样广泛的应用程序。与任何编程语言选择讨论一样,我认为更重要的问题是:
关于第一个问题,如果您这样做主要是为了学习价值,我建议您看一下Haskell,因为支持材料范围很广(书籍,文章,活跃社区等)。
关于第二个问题,Haskell具有不错的库范围(尽管有些库比其他库更成熟),但是Scala(在JVM上运行的混合OO功能语言)具有的优点是您可以逐渐过渡到功能样式,并且您可以使用各种Java可访问的库。
实际上,您在PP中可以做的所有事情都可以在FP中完成,反之亦然。这只是编写某些内容的另一种方法-对该问题的另一种观点以及解决问题的另一种方法。
但是,由于使用FP的人并不多,问题更多的是缺少良好的库,可移植性/可维护性(因为维护人员比Scheme拥有更好的机会来理解用C ++编写的内容),以及缺少文档和社区。我知道有一些文档,但是,将其与C ++,C#或Java进行比较,您会理解我的意思。
但是,如果您确实想执行FP,则即使在C ++和C#中也可以使用此样式。当然,如果您使用标准库,它将不是100%FP。不幸的是,我认为C#没有针对与函数式编程一起使用而进行过优化,它可能会带来很多性能问题。
我对FP的看法比较主观。这不是一个严格的声明。
从我所看到的,更多的是品味而不是功能(不是双关语)。确实没有任何一种语言风格可以使它在特定任务上固有地变好或变差。
通常,使用最容易表达问题解决方案的语言。对于函数式编程,这是根据功能轻松表达问题的解决方案的时候(即名称。通常,它对数学运算,AI,模式匹配非常有用;通常,任何可以分解为必须应用以获得答案的规则的事物。在充分分析问题之后,您才能真正确定要使用的“最佳”语言。这是伪代码派上用场的地方。如果您发现自己编写的外观类似于FP的伪代码,请使用FP。
当然,所有完整的编程语言在功能上都是等效的,因此,就可以解决的问题而言,选择哪种语言都没有关系。主要影响将在于编码效率和准确性以及维护的简便性。
还请注意,可以通过巧妙设计的API在OO语言中模拟FP。例如,我已经看到许多Java库(JMock是一个示例),它们使用方法链接来模拟FP DSL。然后,您将看到诸如以下的构造:
logger.expects(once()).method("error")
.with( and(stringContains(action),stringContains(cause)) );
本质上,这会构建一个函数,该函数将被评估以确定模拟对象上的某些调用顺序是否正确。(例如从http://www.jmock.org/yoga.html中被盗的示例)
在其他OO语言中,另一个类似于FP的语法是使用闭包,例如在Ruby中。