Functional programming 函数式编程和命令式编程之间的折衷

Functional programming 函数式编程和命令式编程之间的折衷,functional-programming,immutability,Functional Programming,Immutability,我已经使用函数式编程(FP)风格一年多了,我看到了它的优点。但是,在某些情况下,命令式样式(可变状态、顺序相关语句)更适合问题,并且不会影响FP的优势。我想知道我将在下面描述的折衷方案是否被广泛使用,是否有名称,是否有任何语言或库可以帮助实施它(类似于Haskell实施纯FP的方式) 我认为这个问题更适合StackOverflow,但如果社区认为它应该转移到programmers.stackexchange,我会转移到那里 程序的两个方面可以是不可变的:符号绑定和数据结构。如果在Java中声明为

我已经使用函数式编程(FP)风格一年多了,我看到了它的优点。但是,在某些情况下,命令式样式(可变状态、顺序相关语句)更适合问题,并且不会影响FP的优势。我想知道我将在下面描述的折衷方案是否被广泛使用,是否有名称,是否有任何语言或库可以帮助实施它(类似于Haskell实施纯FP的方式)

我认为这个问题更适合StackOverflow,但如果社区认为它应该转移到programmers.stackexchange,我会转移到那里

程序的两个方面可以是不可变的:符号绑定和数据结构。如果在Java中声明为“final”或在Scala中声明为“val”,则符号绑定是不可变的;如果没有公共方法或函数可以就地更改数据结构,则数据结构是不可变的。这包括四种情况:

  • 不可变符号绑定、不可变数据结构(完整FP)
  • 不可变的符号绑定、可变的数据结构(如Java中的“final HashMap x”)
  • 可变符号绑定、不可变数据结构(如Scala中的“var x:immutable.Map”)
  • 可变符号绑定、可变数据结构(完全强制)
  • 不可变的数据结构很有价值,因为它们不必进行防御性复制,并且可以利用结构共享,因此我只考虑#1和#3。可变符号绑定可能会导致依赖项混淆,但前提是它们在代码库的很大一部分共享。如果它们仅在函数中可用作为局部变量(因此也是线程局部变量),它们是无害的

    此外,在小范围内处理可变符号绑定是非常有用的——迭代数学算法是我的一个常见用例。我所有的循环局部状态更改都可以被重写为递归,但很难看到其好处。当我编写算法时,我的伪代码要么是局部状态更改,要么是我正在移植的rtran示例是局部状态更改,将其转换为递归函数会混淆其含义,而不是使其变得清晰。之后,编译器必须反转该过程,将其转换为机器代码,看起来非常像“直观的”“原创,如果转换不完美,可能会失去效率

    但另一方面,程序的大规模结构(不适合单个屏幕的所有内容)通过不可变的数据结构和功能得到了极大的改进,没有副作用。在案例#3中,我们仍然可以获得(函数的)引用透明性,类似Haskell的延迟计算是可能的,我们可以获得不可变数据的所有优点(所有值都是不可变的,尽管局部符号不是),我们还可以平滑地过渡到并行化,尽管粒度的规模是一个函数

    当然,我可以在自己的程序中做任何我想做的事情;我想问的是,这是否是一种常见的样式,它是否有名称,是否有任何语言或库支持/实施它。(Clojure瞬态是案例2的一个例子,数据结构是暂时可变的。带有局部变量的Clojure模拟了#3,但有很多开销——它比局部“变量”慢得多。)在Scala中,它没有以一种简单的方式被翻译成机器代码,我想这是我所要求的。除此之外,我还没有找到任何例子。)