可以将所有代码表示为一系列Map / Filter / Reduce操作吗?


16

我最近一直在重构大量代码并将其替换为Linq查询。

消除语言偏见-Linq本质上是一组对一系列数据进行操作的Map / Filter和Reduce操作。

这让我开始思考,从理论上讲,我能走多远。我是否可以将整个代码库重写为一系列(甚至单个)Map / Filter和Reduce操作。

不幸的是,我得到报酬去做有用的事情,所以我无法做进一步的实验,但是我无法想到任何无法重构的代码结构。副作用代码可以通过monad处理。即使输出本质上是将内存地址映射到屏幕地址。

有什么东西(理论上)不能重写为Linq查询吗?



我一直认为,“ reduce”足以保证Turing完成(映射和过滤器可以实现为reduce操作,不是吗?)-至少,该功能语言等同于reduce。我对Linq不太了解,无法确定其中的实现与功能实现有多紧密的关系。
blueberryfields

1
我不知道,但是一个粗略的经验法则是,任何人甚至考虑编写所有代码的任何事情都将成为图灵完整的。但是,这样做的必然结果是,图灵的完成并不十分令人兴奋。
psr

1
我同意psr;我认为这个问题的有效答案需要解决图灵的完整性。证明可能会尝试仅使用这些操作来实现图灵机。
罗布

闲想:即使我们允许胡说八道my_list.map(_ignored => a copy of my_list),似乎这样的程序在空间上的使用也受到多项式的限制(取决于程序的长度)。这样的语言肯定无法计算出PSPACE中没有的问题。但是,由于PSPACE中的许多问题被认为是棘手的,更不用说较大的类了,所以这可能不是一个非常严重的限制。

Answers:


1

它被称为函数式编程,并且被许多人视为基础概念。这是Joel On Software的一个很好的介绍。更为技术性的答案是“不”,目前没有已知的方法(以明确定义的方式)向您的计算机提出无法通过SKI演算回答的问题。


1
还有远远更多的函数式编程比功能mapfilter以及reduce(这正好三次,如果我们忽略了图灵完备性和实际使用FP语言)。实际上,它们只是相当通用,因此通常很有用,但是实际上是功能编程的非常简单的应用程序。最小拉姆达微积分可以定义许多其他函数,而不是相反。

“这是Joel On Software的一个很好的介绍” -设法使Fortran与Basic混淆,因此我不会对其中的其他事实有太多的信任。
quant_dev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.