Programming languages 在命令式语言中可以使用哪些函数式语言技术?

Programming languages 在命令式语言中可以使用哪些函数式语言技术?,programming-languages,functional-programming,imperative,Programming Languages,Functional Programming,Imperative,哪些通常与函数式语言相关的技术或范例也可以有效地用于命令式语言 e、 g: 在没有尾部调用优化的语言中,递归可能会出现问题,将其使用限制在一组狭窄的情况下,因此其用处有限 Map和filter已经进入了非函数式语言,尽管它们有一种函数式的感觉 我碰巧真的很喜欢不用担心函数式语言中的状态。如果我特别固执,我可能会在不修改变量的情况下编写C程序,只将状态封装在传递给函数的变量和函数返回的值中 即使函数不是第一类值,我也可以用Java语言将一个函数包装到一个对象中,并将其传递到另一个方法中。就像函

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

e、 g:

  • 在没有尾部调用优化的语言中,递归可能会出现问题,将其使用限制在一组狭窄的情况下,因此其用处有限
  • Map和filter已经进入了非函数式语言,尽管它们有一种函数式的感觉
我碰巧真的很喜欢不用担心函数式语言中的状态。如果我特别固执,我可能会在不修改变量的情况下编写C程序,只将状态封装在传递给函数的变量和函数返回的值中

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


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

几乎所有这些思想都是如此

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


早在时代初期,我们就曾担心“耦合”和“内聚”。学习FP将使您能够编写具有最佳(最小)耦合和高内聚性的系统。

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


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

以下是在非FP语言中执行FP的障碍:

  • 如果该语言不支持lambda/closures,并且没有任何语法糖分可以轻松地对其进行破解,那么您将一事无成。如果没有闭包,就不能调用map/filter
  • 如果语言是静态类型的,并且不支持泛型,那么您就完蛋了。所有好的FP都使用泛型
  • 如果该语言不支持尾部递归,您将受到阻碍。您可以迭代地编写例如“map”的实现;此外,您的数据通常不会太大,递归也可以
  • 如果该语言不支持代数数据类型和模式匹配,您将受到轻微的阻碍。一旦你尝过它们,就不吃是很烦人的
  • 如果语言不能表达类型类,那么,哦。。。你会过得去的,但如果这不仅仅是有史以来最令人敬畏的特性,而且Haskell是唯一一种支持良好的远程流行语言,那就糟糕了

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

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

我最想念的是:

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

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


我知道这是一个古老的问题,但从中可以看到一些例子的答案,这些答案在一定程度上深入了这个问题。

动机:我爱上了哈斯克尔。我要和哈斯克尔结婚,生她的孩子。啦啦啦啦,我不听。