为什么“纯粹”的功能被称为“纯粹”?

时间:2011-10-13 07:05:17

标签: function functional-programming purely-functional pure-function

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

为什么单词“pure”用于描述具有这些属性的函数?谁首先以这种方式使用“纯”这个词,何时?是否还有其他词语意思相同?

5 个答案:

答案 0 :(得分:25)

为了回答你的第一个问题,数学函数通常被描述为某些指定变量的“纯粹”。 e.g:

  

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

因此,我认为你不会发现真正的“第一次”事件。

对于编程语言,稍微搜索会显示Ada 95pragma Pure),High Performance Fortran(1993)(PURE)和VHDL-93({{1所有都包含'纯函数'的正式概念。

Haskell(1990)相当明显,但纯度并不明确。海湾合作委员会的C对{pure'的各种不同级别有various function attributes

几本书:Rationale for the C programming language(1990)使用该术语,Programming Languages and their Definitions(1984)也是如此。但是,两者显然只使用一次! 对IBM个人计算机进行编程,Pascal (也是1984)使用了这个术语,但是从Google的限制视图中可以看出Pascal编译器是否支持它。 (我怀疑不是。)

一个有趣的说明是格林,Ada的前身,actually had a fairly strict 'function' definition - 甚至不允许内存分配。然而,在它变成Ada之前就已经被删除了,其中函数可能有副作用(I / O或全局变量),但不能修改它们的参数。

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

最后一份文件明确指出,自文件C28-6571-2以来,它包括REDUCIBLE作为新的变更。所以REDUCIBLE,可能是编程语言中正式纯函数的第一个化身,出现在1966年1月到7月之间。

更新:Google群组中最早的“纯粹功能”实例is from 1988,很容易在书中引用。

答案 1 :(得分:15)

有几个神话:

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

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

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

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

答案 2 :(得分:6)

它来自“功能”的数学定义,其中功能不可能产生副作用。

答案 3 :(得分:4)

为什么单词“pure”用于描述具有这些属性的函数?

来自Wiktionary > pure # adjective

  
      
  • 没有瑕疵或瑕疵;污点
  •   
  • 不含异物或污染物
  •   
  • 没有不道德的行为或品质;清洁
  •   
  • 科学的一个分支,为了自己的目的而不是为另一个科学分支服务。
  •   

很明显,当它们仅受输入影响时,相互作用函数的行为最容易推理,它们本身只会影响它们的输出。因此,不可避免地要注意和分类这些功能。现在我们可以用什么词来描述具有这些属性的函数? “没有外来物质或污染物”和“没有不道德的行为或品质”似乎很好地描述了这一点。

谁首先以这种方式使用“纯”这个词,以及什么时候?

我太年轻了,不能自信地回答这个问题。然而,我认为, pure (或一些非常接近的同义词)这个词不可避免地会被用来描述以这种方式行事的函数。

是否还有其他词语表示大致相同的内容?

你自己说:“引用透明”。但是,您似乎认为“引用透明度”仅包含“纯函数”这一短语的部分含义。我不同意;我觉得它完全是同义词。来自Wikipedia > Referential Transparency

  

如果表达式可以替换为其值而不改变程序的行为,则表示该表达式是引用透明的。 (强调我的)

Haskell社区有时以类似的方式使用形容词“safe”。 (参见Safe库,以避免抛出异常。与unsafePerformIO对比

我现在想不出任何其他同义词。

答案 4 :(得分:2)

函数的概念起源于数学。函数的数学概念或多或少是从一个集合到另一个集合的映射。从这个意义上讲,功能不可能产生副作用;不是因为它们“更好”,或者因为它们被明确定义为没有副作用,而是因为“有副作用”的概念对于这个函数的定义没有任何意义。数学函数不是一系列执行的步骤,那么这些步骤中的任何一个如何“影响”你正在谈论的其他数学对象?

当人们开始研究计算时,他们开始对机器可实现的算法感兴趣,这些算法用于计算给定输入的数学函数的值。人们开始谈论可计算函数。但函数在计算机中实现(至少在命令式语言中,这是程序员最初使用的)一系列可执行步骤,显然可以< / em>有副作用。

因此,程序员将函数视为算法而非数学函数变得很自然。那么一个函数就是一个纯粹的数学函数,所有关于函数的理论都应用了数百年,而不是泛化程序员的函数,这个函数不能用于推理。方式。