函数式编程那些事儿
Posted 程序那些事儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程那些事儿相关的知识,希望对你有一定的参考价值。
函数式编程是一种编程范式,在其中它试图将每个函数都绑定到纯数学函数中。这是一种声明式的编程风格,着重于解决什么而不是如何解决。
Clojure,Common Lisp,Erlang,Haskell和Scala是遵循函数式编程方法的一些著名编程语言。编程范例基于lambda演算,下面简要说明:
Lambda演算
它使用表达式来代替语句。与执行语句以分配变量的语句不同,表达式的求值产生一个值。Lambda演算构成了几乎所有使用的功能编程语言的基础。
Lambda Calculus由Alonzo Church开发,是用于研究具有函数的计算的框架。使用lambda演算认为任何事物都是可计算的。它可以被标记为所有语言中最简洁的编程语言。
就计算能力而言,lambda演算类似于图灵机,后者为命令式编程奠定了基础。简单来说,lambda演算是一个描述函数及其评价的理论框架。
纯函数
纯函数具有两个重要属性,它们是:
无论其他因素如何,始终使用相同的参数产生相同的输出,此属性也称为不变性
纯函数要么提供一些输出,要么修改任何参数或全局变量,即它们没有副作用,次属性叫做确定性
由于纯函数没有副作用或隐藏的I / O,因此使用函数范式构建的程序易于调试。此外,纯函数使编写并发应用程序更加容易。
使用函数式编程风格编写代码时,有能力的编译器将能够:
记住结果
并行运算
等待评估结果
递归
在函数式编程范例中,没有for和while循环。相反,函数式编程语言依赖于递归进行迭代。递归是使用递归函数实现的,递归函数会重复调用自己,直到达到基本情况为止。
引用透明性
一旦在函数式编程语言中定义了变量,就不允许在程序执行期间更改它们持有的值。这称为引用透明性。它确保相同的语言表达式给出相同的输出。
功能程序没有任何赋值语句。为了在使用功能编程开发的程序中存储其他值,必须定义新变量。在这样的程序中,变量的状态在任何时候都是恒定的。
引用透明性几乎消除了任何不良影响的可能性,这是因为在程序执行的任何时候都可以用其实际值替换任何变量。
函数是一流的,可以是高阶的
函数式编程风格的函数被视为变量。因此,它们是一流的功能。这些一流的函数被允许作为参数传递给其他函数,或者从函数返回或存储在数据结构中。
高阶函数是将其他函数用作参数和/或返回函数的函数。在函数式编程语言中,一等函数可以是高阶函数。
变量是不可变的
变量是不可变的,即变量一旦初始化就无法修改。尽管我们可以创建一个新变量,但不允许修改现有变量。
函数式编程语言中变量的不变性质以在整个程序执行过程中保持状态的形式受益。
优点
由于纯函数不会更改任何状态,并且完全取决于输入,因此它们很容易理解。这些函数给定的返回值与它们产生的输出相同。纯函数的参数和返回类型由其函数签名给出。
由于纯函数具有避免更改变量或变量之外的任何数据的性质,因此实现并发变得有效
它支持延迟评估的概念,这意味着仅在需要时才评估和存储该值。
纯函数仅接受一次参数并产生不变的输出。因此,它们不会产生任何隐藏的输出。它们使用不可变的值,从而使调试和测试更加容易。
它的样式将函数视为值,并将其作为参数传递给其他函数。它增强了代码的理解性和可读性。
缺点
不变的值与递归结合可能会导致性能下降
在某些情况下,编写纯函数会导致代码的可读性下降
尽管编写纯函数很容易,但是将其与应用程序的其余部分以及I / O操作结合起来很困难
以递归方式编写程序来代替使用循环,这可能是一项艰巨的任务
应用领域
通常,函数式编程语言通常首选用于学术目的,而不是用于商业软件开发。
但是,遵循功能性编程范例的几种杰出的编程语言,例如Clojure,Erlang,F#,Haskell和Racket,被广泛用于开发各种商业和工业应用。
WhatsApp利用Erlang(一种遵循功能性编程范例的编程语言)让100多名员工即可管理超过15亿人的数据。
函数式编程风格的另一个重要语言是Haskell。Facebook在其反垃圾邮件系统中使用了它。甚至javascript(使用最广泛的编程语言之一)也喜欢使用函数式编程。
函数式编程风格对于各种编程语言引领不同领域至关重要。例如,统计中的R和财务分析中的J,K和Q。
领域特定的声明性语言(例如Lex / Yacc和SQL)甚至使用这种编程范例的某些元素来避开可变值。
通常,此范例广泛用于:
针对并发或并行的应用
进行数学计算
总结
除了纯函数式编程语言外,还可以在非函数式编程语言中建立函数式编程方法。
C ++ 11,C#3.0和Java 8都添加了用于简化书写风格的函数式编程。
尽管通常以功能样式编写,但是Scala具有副作用和易变状态的存在。因此,可以将编程语言置于命令式和功能性编程样式之间的中间状态。
以上是关于函数式编程那些事儿的主要内容,如果未能解决你的问题,请参考以下文章