纯函数式编程

计算机科学中,纯函数式编程通常指示一种编程范式,这是建造计算机程序的结构和元素的一种风格,就是将所有计算都当作数学函数的求值(evaluation)。纯函数式编程还可以定义为禁用状态英语State (computer science)变更和可变数据。

纯函数式编程主要在于确保函数遵守函数式范式,只依赖于它们的实际参数(argument),而不用管任何全局或局部的状态。

纯与非纯函数式编程区别编辑

在纯与非纯函数式编程之间的确切区别是有争议的事情[1]

当一个程序使用了某些函数式编程概念的时候, 比如头等函数高阶函数,它通常就被称为是函数式的[2]。但是,头等函数不必然是纯函数式的,因为它可以使用来自指令式范式的技术,比如数组或输入/输出方法,而它们不是纯函数程序。事实上,最早被引证为函数式的编程语言,IPLLisp[3][4],按照当前定义都是非纯函数式语言。

纯函数式数据结构英语Purely functional data structure必然是持久数据结构英语Persistent data structure。持久性是函数式编程所要求的,如果没有它,相同的计算就可能返回不同的结果。函数式编程可以使用非纯函数式的持久数据结构,比如持久数组英语Persistent array,而这些数据结构不可以用在纯函数式程序中。

I/O单子英语I/O monad典型的用于在纯函数式语言中进行输入/输出。

纯函数式编程的性质编辑

严格与非严格求值编辑

每种求值策略对当纯函数式编程时都返回相同的结果。特别是,它确保编程者不需要考虑程序是按什么次序求值的,因为及早求值将返回同惰性求值相同的结果。但是,仍有可能一个及早求值可以不终止,而相同程序的惰性求值会停机。

这么做的好处是惰性求值可以被更容易的实现,因为所有表达式在任何时刻都返回同样的结果(不用管程序的状态),它们的求值可以随着需要而推延。

并行计算编辑

纯函数式编程简化了并行计算[5],因为求值的两个纯函数式的部份永不交互。

数据结构编辑

纯函数式数据结构,是可以用纯函数式语言如Haskell实现的数据结构。实际上,这意味着建造这种数据结构,必须只使用持久数据类型比如元组和类型英语sum type积类型英语product type,和基本类型如整数、字符、字符串。纯函数式数据类型,同它们的指令式对应者相比,经常以不同的方式表现[6]。例如,具有访问和更新的常数时间的数组,是多数指令式语言的基本构件,而很多指令式数据结构,比如散列表二叉堆,是基于数组的。数组可以被替代为映射随机访问列表英语Linked list#Random access lists,它容许纯函数式实现,但是访问和更新时间复杂度是对数。因此,纯函数式数据结构可以用在非纯函数式语言中,但是它们可能不是能得到的最有效率的工具,特别是不要求持久性的情况下。

纯函数式语言编辑

纯函数式语言是只认可纯函数编程的语言。但是纯函数式程序可以用非纯函数式的语言写成。

参见编辑

引用编辑

  1. ^ Sabry, Amr. What is Purely Functional Language ?. Journal of Functional Programming. January 1993, 8 (1): 1–22. doi:10.1017/S0956796897002943. 
  2. ^ Atencio, Luis. Functional Programming in Javascript. Manning Publications. 18 June 2016. ISBN 978-1617292828. 
  3. ^ The memoir of Herbert A. Simon (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 claims that he, Al Newell, and Cliff Shaw are "commonly adjudged to be the parents of [the] artificial intelligence [field]", for writing Logic Theorist, a program which proved theorems from Principia Mathematica automatically. In order to accomplish this, they had to invent a language and a paradigm which, which viewed retrospectively, embeds functional programming.
  4. ^ McCarthy, John. History of Lisp. In ACM SIGPLAN History of Programming Languages Conference. June 1978: 217–223 [2020-04-24]. doi:10.1145/800025.808387. (原始内容存档于2008-06-07). 
  5. ^ Marlow, Simon. Parallel and Concurrent Programming in Haskell: Techniques for Multicore and Multithreaded Programming. O'Reilly Media. 18 June 2013. ISBN 978-1449335946. 
  6. ^ Purely functional data structures 页面存档备份,存于互联网档案馆 by Chris Okasaki, Cambridge University Press, 1998, ISBN 0-521-66350-4