Algorithm 任何算法谜题都可以用纯函数的方式实现吗?

Algorithm 任何算法谜题都可以用纯函数的方式实现吗?,algorithm,language-agnostic,functional-programming,Algorithm,Language Agnostic,Functional Programming,我一直在考虑编程语言设计,从以下定义: 这与命令式编程不同,命令式编程要求详细描述要运行的算法 再往下看: 。。。任何不是必需的编程风格 然后它继续表示函数式语言,因为它们不是命令式的,所以本质上是声明式的 然而,这让我想知道,纯函数式编程语言是否能够解决任何算法问题,或者约束是否基于该语言中可用的函数 我最感兴趣的是关于这个主题的一般想法,尽管如果具体的例子可以说明这一点,我当然欢迎他们。是的,Haskell、Erlang等都是图灵完整语言。原则上,您不需要可变状态来解决问题,因为您始终可以创

我一直在考虑编程语言设计,从以下定义:

这与命令式编程不同,命令式编程要求详细描述要运行的算法

再往下看:

。。。任何不是必需的编程风格

然后它继续表示函数式语言,因为它们不是命令式的,所以本质上是声明式的

然而,这让我想知道,纯函数式编程语言是否能够解决任何算法问题,或者约束是否基于该语言中可用的函数


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

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

根据

这三个计算过程(递归、λ-演算和图灵机)被证明是等价的。”


其中,图灵机可以理解为“程序的”,lambda演算可以理解为“功能的”。

使用状态单子,您可以在Haskell中以命令式风格编程


因此,关于Haskell本质上是声明性的这一断言需要谨慎对待。从积极的一面来看,它相当于命令式编程语言,在实际意义上也不完全忽视效率。

虽然我完全同意调用Church Turing论题的答案,但这一点值得注意实际上,这是一个有趣的问题。如果我有一个并行计算问题(在严格的数学意义上,它不是算法问题),例如多个生产者/消费者队列或多台机器之间的某些网络协议,这能由图灵机器充分建模吗?它可以被模拟,但如果我们模拟它,我们就失去了在问题中具有并行性的目的(因为这样我们可以在图灵机器上找到更简单的算法).那么,如果我们不想失去问题固有的并行性(以及我们对它感兴趣的原因),该怎么办,我们无法删除状态的概念?

函数式编程的最大区别在于它避免了可变状态。命令式编程通常会更新变量,函数式编程将定义新的只读值

这将影响性能的主要地方是使用可更新数组的算法。命令式实现可以在O(1)时间内更新数组元素,而纯函数式实现所能达到的最佳效果是O(logn)(使用排序树)

请注意,函数式语言通常有一些方法可以使用具有O(1)访问时间的可更新数组(例如,Haskell在其状态转换器monad中提供了这种方法)。然而,这可以说是一种命令式编程方法……这没什么错;毕竟,对于特定的工作,您希望使用最好的工具


不过,O(log N)增量数组更新的函数式并不都是坏的,因为函数式算法似乎很适合并行化。

好的,Church和Turing提供了这一点,但我们实际上如何做呢

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

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

有时结果是一团糟,但结果往往出人意料地优雅。唯一真正的诀窍不是传递永远不变的参数,而是让它们在外部环境中绑定。

我记得在某个地方读到过这样一篇文章:当用纯函数的方式解决问题时,有些问题会变得更加困难,但我无法理解em来查找引用

如上所述,主要问题是数组更新。虽然编译器在某些情况下可能会在后台使用可变数组,但必须保证整个程序中只存在一个数组引用

这不仅是一个难以理解的数学事实,而且在实践中也是一个问题,如果你不使用不纯的结构

更主观的说法是,所有图灵完全语言都是等价的,这只在狭义的数学意义上是正确的。在“布鲁布悖论”一节中探讨了这个问题

图灵完备性等形式化结果可能是可证明正确的,但它们不一定有用。这些结果可能是NP完全的,但销售人员一直在旅行。它们似乎不觉得有必要遵循“最优”路径,因此定理是不相关的

注意:我不是想抨击函数式编程,因为我真的很喜欢它。重要的是要记住它不是万能的。

太长了,不能作为评论发布

函数式编程和命令式编程具有相同的能力:无论一方能做什么,另一方都能做。它们被称为图灵完备。图灵机能计算的函数正是递归函数理论和λ-演算所表达的函数


但丘奇-图灵理论本身并不重要。它断言任何计算都可以由图灵机器进行。这将一个非正式的想法——计算——与一个正式的想法——图灵机器联系起来。还没有人发现任何我们认为是图灵机不能做的计算。将来会有人发现这样的事情吗谁能说出来。

这是一个很好的观点,这实际上可以归结为图灵复合体