为什么"纯粹"的功能被称为"纯粹"?

Mat*_*rog 39 functional-programming function purely-functional pure-function

纯函数是没有副作用的函数 - 它不能做任何类型的I/O并且它不能修改任何东西的状态 - 并且它是引用透明的 - 当使用相同的输入多次调用时,它总是给出相同的产出.

为什么单词"pure"用于描述具有这些属性的函数?谁首先以这种方式使用"纯"这个词,何时?是否有其他词语意味着大致相同的事情?

por*_*ges 25

为了回答你的第一个问题,数学函数通常被描述为某些指定变量的"纯粹".例如:

第一项是x的纯函数,第二项是y的纯函数

因此,我认为你不会发现真正的"第一"事件.

对于编程语言,一点点搜索表明Ada 95(pragma Pure),High Performance Fortran(1993)(PURE)和VHDL-93(pure)都包含'纯函数'的正式概念.

Haskell(1990)是相当明显的,但纯度并不明确.GCC的C具有各种不同级别的"纯"的各种功能属性.

几本书:C编程语言的基本原理(1990)使用这个术语,编程语言及其定义(1984)也是如此.但是,两者显然只使用一次!在编写IBM个人计算机时,Pascal(也是1984)使用了这个术语,但是从Google的限制视图中可以看出Pascal编译器是否支持它.(我怀疑不是.)

一个有趣的说明是,Ada的前身Green 实际上有一个相当严格的"函数"定义 - 甚至不允许内存分配.然而,在它变成Ada之前就已经被删除了,其中函数可能有副作用(I/O或全局变量),但不能修改它们的参数.

C28-6571-3(第一个PL/I参考手册,在编译器之前编写)显示PL/I支持纯函数,以REDUCIBLE(= pure)属性的形式,早在1966年 - 编译器时最初发布.(这也回答了你的第三个问题.)

最后一份文件特别指出,它包括REDUCIBLE自文件C28-6571-2以来的新变化.因此REDUCIBLE,这可能是编程语言中正式纯函数的第一个化身,出现在1966年1月到7月之间.

更新:这个意义上来说,Google Groups上最早的"纯粹功能"实例是从1988年开始,它很容易在书中引用.


Uda*_*ddy 15

几个神话:

  • 术语"纯函数"并非来自数学,其中所有函数本质上都是"纯粹的",因此,从来没有必要将任何东西称为"纯函数".

  • 该术语不是来自命令式编程.早期命令式编程语言Fortran,Algol 60,Pascal等总是有两种抽象:"函数"根据输入产生结果,"程序"采取一些输入并执行操作.对于没有副作用的"功能",它被认为是良好的编程实践.他们没有必要有副作用,因为总是可以使用程序.

那么,"纯功能"这个词还能来自哪里呢?答案是 - 有点明显.它来自不纯的函数式编程语言,其中最重要的是Lisp.Lisp是在1958年到1960年之间设计的(在Algol 60的第一和第二次报告之间,其设计麦卡锡参与了,但并不满意).Lisp的设计基本上基于函数式编程.然而,它也允许副作用作为一种实用的选择.它没有命令或程序的概念.因此,在Lisp中,一个人大多写了"纯函数",但偶尔会写一个"不纯函数",即带有副作用的函数来完成某些事情.术语"纯Lisp"或"Lisp的纯功能子集"已经使用了很长时间.慢慢地,通过渗透,这种"纯洁"的观念已经侵入了我们所有的空间.

命令式编程语言可能抵制这一趋势.但是,一旦C决定废除"程序"的概念并将其称为"无效功能",他们就没有太大的支持.


Ign*_*ams 6

它来自"函数"的数学定义,其中函数不可能具有副作用.

  • 在数学中,"函数"一词意味着程序员称之为"纯函数".但是在许多命令式编程语言中,"函数"意味着"过程" - 一个需要输入(或不输入)的动作,然后可能改变一些状态或I/O,然后返回一些输出(或不返回).所以"纯粹的功能"是一种说"功能与数学功能"的方式.但我的问题是,为什么"纯粹"?为什么不"数学函数"或"非I/O函数"或类似的东西? (10认同)
  • @MatrixFrog,这是因为数学是纯粹,简单和美丽的,而全球状态monad是丑陋和肮脏的.这就是为什么函数是"纯粹的"而程序并不是那么简单. (2认同)
  • @Rahul:无论你对"数学"这个词有什么数字内涵,"数学函数"的含义都是明确的,与数字没有任何关系. (2认同)