【问题标题】:What functional language techniques can be used in imperative languages?命令式语言可以使用哪些函数式语言技术?
【发布时间】:2010-10-09 17:28:47
【问题描述】:

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

例如:

  • 在没有尾调用优化的语言中,递归可能会出现问题,将其使用限制在少数情况下,因此其用处有限
  • 地图和过滤器已经在非函数式语言中找到了自己的方式,尽管它们给人的感觉是函数式的

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

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

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

【问题讨论】:

  • 动机:我爱上了 Haskell。我要嫁给哈斯凯尔并生下她的孩子。
  • 啦啦啦啦啦我没在听。

标签: programming-languages functional-programming imperative


【解决方案1】:

我知道这是一个老问题,但可以在this video on infoQ 中看到一些示例的答案,其中深入探讨了它。

【讨论】:

    【解决方案2】:

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

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

    我最怀念的事情:

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

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

    【讨论】:

      【解决方案3】:

      以下是使用非 FP 语言进行 FP 的障碍:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          几乎所有?

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

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

          【讨论】:

            猜你喜欢
            • 2012-06-15
            • 1970-01-01
            • 2010-09-25
            • 1970-01-01
            • 2013-07-23
            • 2011-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多