任何算法难题都可以以纯粹的功能方式实现吗?

Nil*_*ect 2 language-agnostic algorithm functional-programming

我一直在考虑编程语言设计,并从维基百科上声明性编程的定义:

这与命令式编程形成对比,命令式编程需要运行算法的详细描述.

进一步向下:

......任何不必要的编程风格....

然后它继续表达功能语言,因为它们不是必要的,它们本质上是声明性的.

但是,这让我想知道,纯粹的函数式编程语言能够解决任何算法问题,还是基于该语言中可用的函数的约束?

我最感兴趣的是关于这个主题的一般想法,虽然如果具体的例子可以说明这一点,我当然欢迎他们.

Ste*_* B. 20

根据Church-Turing Thesis,

三个计算过程(递归,λ演算和图灵机)被证明是等价的"

其中图灵机可以读作"程序",而lambda演算可以读作"功能".


dsi*_*cha 13

是的,Haskell,Erlang等是图灵完整的语言.原则上,您不需要可变状态来解决问题,因为您始终可以创建新对象而不是改变旧对象.当然,Brainfuck也是图灵完成的.换句话说,仅仅因为算法可以用函数式语言表达并不意味着它不是非常尴尬.


Nor*_*sey 5

好了,教会和图灵provied这是可能的,但我们究竟要怎样什么?

以纯函数式重写命令式代码是我经常分配给本科生的一项练习:

  • 每个可变变量都成为一个函数参数
  • 循环使用递归重写
  • 每个goto表示为带参数的函数调用

有时出来的是混乱,但结果往往是出奇的优雅.唯一真正的诀窍是不传递永不改变的参数,而是将它们绑定在外部环境中.