7

通常与函数式语言相关的哪些技术或范式也可以有效地用于命令式语言?

例如:

  • 递归在没有尾调用优化的语言中可能会出现问题,将其使用限制在少数情况下,因此有用性有限
  • 映射和过滤器已经在非函数式语言中找到了它们的方式,即使它们对它们有一种函数式的感觉

我碰巧真的很喜欢不必担心函数式语言的状态。如果我特别固执,我可能会在不修改变量的情况下编写 C 程序,只将我的状态封装在传递给函数的变量和函数返回的值中。

即使函数不是一等值,我也可以用 Java 将一个对象包装在一个对象中,然后将其传递给另一个方法。就像函数式编程一样,只是不那么有趣。

那么,对于函数式编程的老手来说,当您使用命令式语言进行编程时,您成功应用了 FP 的哪些想法?

4

5 回答 5

11

几乎所有的人?

如果您了解函数式语言,则可以编写由函数式风格“通知”的命令式程序。这将使您远离副作用,而转向在任何特定点阅读程序文本足以让您真正了解该程序在该点的含义的程序。

回到时间的黎明,我们曾经担心“耦合”和“凝聚力”。学习 FP 将引导您编写具有最佳(最小)耦合和高内聚的系统。

于 2009-02-25T02:43:25.210 回答
6

以下是妨碍使用非 FP 语言进行 FP 的事情:

  • 如果该语言不支持lambda/closures,并且没有任何语法糖可以轻松破解它,那么您就死定了。你不会在没有闭包的情况下调用 map/filter 。
  • 如果语言是静态类型的并且不支持泛型,那么你就死定了。所有好的 FP 东西都使用通用性。
  • 如果语言不支持tail-recursion,你就会受到阻碍。您可以迭代地编写例如“map”的实现;通常您的数据可能不会太大,递归就可以了。
  • 如果该语言不支持代数数据类型和模式匹配,您将受到轻微阻碍。一旦你尝过它们,就没有它们是很烦人的。
  • 如果语言不能表达类型类,好吧,哦,好吧......你会过得去的,但如果这不仅仅是有史以来最棒的功能,而且 Haskell 是唯一一个远程流行的语言,它有很好的支持。
于 2009-02-25T05:04:04.060 回答
3

没有一流的函数确实会阻碍编写函数式程序,但有一些事情你可以做而不需要它们。第一个是避免可变状态 - 尝试让大部分或所有类返回代表修改状态的新对象,而不是在内部进行更改。例如,如果您正在编写一个带有add操作的链表,您可能希望返回新的链表,add而不是修改对象。

虽然这可能会降低您的程序效率(由于创建和销毁的对象数量增加),但您将能够更轻松地调试程序,因为对象的状态和操作变得更加可预测,更不用说能够嵌套函数调用更深入,因为它们有状态输入和输出。

于 2009-02-25T02:48:16.570 回答
3

我已经成功地使用了很多高阶函数,尤其是传入的那种而不是返回的那种。返回的那种可能有点乏味但可以模拟。

各种应用数据结构和递归函数在命令式语言中都能很好地工作。

我最怀念的事情:

  • 几乎没有命令式语言保证优化每个尾调用。

  • 我知道没有命令式语言支持通过模式匹配进行案例分析。

于 2009-02-26T03:42:41.877 回答
0

我知道这是一个老问题,但可以在 infoQ 上的这段视频中看到带有示例的答案,该视频深入探讨了这个问题。

于 2012-01-17T04:12:16.043 回答