在命令式语言中可以使用哪些功能语言技术?

时间:2009-02-25 02:19:43

标签: programming-languages functional-programming imperative

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

e.g:

  • 在没有尾调用优化的语言中,递归可能会出现问题,将其用途限制在一组狭窄的案例中,因此用途有限
  • 地图和过滤器已经找到了进入非功能性语言的方式,即使它们具有某种功能性的感觉

我碰巧真的不想担心功能语言中的状态。如果我特别顽固,我可能会编写C程序而不修改变量,只将我的状态封装在传递给函数的变量和函数返回的值中。

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

那么,对于函数式编程的资深人士,当您使用命令式语言编程时,FP中的哪些想法可以成功应用?

5 个答案:

答案 0 :(得分:11)

几乎所有人都是?

如果您了解功能语言,您可以编写通过功能样式“通知”的命令式程序。这将导致你远离副作用,以及在任何特定点读取程序文本足以让你真正知道该程序的含义的程序。

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

答案 1 :(得分:6)

以下是妨碍用非FP语言进行FP的方法:

  • 如果语言不支持 lambda / closures ,并且没有任何语法糖很容易破解它,那么你就死在了水中。你不要在没有闭包的情况下调用map / filter。
  • 如果语言是静态类型的,并且不支持泛型,那么你就死在了水中。所有优秀的FP材料都使用了通用性。
  • 如果语言不支持尾递归,则会受到阻碍。您可以编写例如迭代地'映射';通常你的数据可能不会太大,递归也没问题。
  • 如果语言不支持代数数据类型和模式匹配,则会受到轻微阻碍。一旦你品尝过它们,就不会有它们,这很烦人。
  • 如果语言不能表达类型,那么,哦......你会过去的,但是如果这不仅仅是最棒的功能,那么很糟糕,但Haskell是唯一的远程流行语言得到了很好的支持。

答案 2 :(得分:3)

没有一流的功能确实会影响编写功能程序,但有一些事情你可以做,不需要它们。第一种是避免可变状态 - 尝试让大多数或所有类返回表示修改状态的新对象,而不是在内部进行更改。例如,如果您使用add操作编写链接列表,则需要从add返回新的链接列表,而不是修改对象。

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

答案 3 :(得分:3)

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

各种应用数据结构和递归函数在命令式语言中运行良好。

我最想念的事情:

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

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

答案 4 :(得分:0)

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