摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/bloghtml
原文:https://hackernoon.com/you-should-learn-functional-programming-in-2017-91177148ec00git
函数式编程已经存在了很长了时间,早在50年代 Lisp 编程语言的介绍中就有提过。若是你有关注近两年里内热门的 Clojure,Scala,Erlang,Haskell,Elixir 等语言的话,其中都有函数式编程的概念。程序员
那么到底什么是函数式编程,为何每一个人都痴迷于它?在这篇文章中,做者将试图回答以上问题,而且激起你对函数式编程的兴趣。github
正如咱们所说的,早在50年代函数式编程开始以前,Lisp 语言就已经在 IBM 700/7000 系列的科学计算机上运行了。Lisp 引入了不少与咱们如今的函数式编程有关的示例与功能,咱们甚至能够称 Lisp 是全部函数式编程语言的鼻祖。编程
这也是函数式编程中最有趣的方面,全部函数式编程语言都是基于相同的 λ演算,这种简单数学基础。闭包
λ演算是图灵完备的,它是一种通用的计算模型,可用于模拟任何一台单带图灵机。它名字中的希腊字母 lambda(λ),被使用在了 lambda 表达式和 lambda 项绑定函数中的变量中。并发
λ演算是一个极其简单但又十分强大的概念。它的核心主要有两个概念:app
函数的抽象,经过引入变量来概括得出表达式;编程语言
函数的应用,经过给变量赋值来对已得出的表达式进行计算;分布式
让咱们来看个小例子,单参数函数 f,将参数递增1。
f = λ x. x+1
假设咱们应用函数在数字5上,那么函数读取以下:
f(5) => 5 + 1
如今,数学知识已经够了。让咱们看一下使函数式编程变得强大的特性有哪些?
在函数式编程中,函数是一等公民,意思是说函数能够赋值给变量,例如在 elixir 中,
double = fn(x) -> x * 2 end
而后咱们能够以下来调用函数:
double.(2)
高阶函数的定义是,接收一个或多个函数变量做为参数,而后生成的新函数,即为高阶函数。让咱们再次使用函数 double 来讲明这个概念:
double = fn(x) -> x * 2 end Enum.map(1..10, double)
这例子中,Enum.map 将一个枚举列表做为第一参数,以前定义的函数做为第二参数;而后将这个函数应用到枚举中的每个元素,结果为:
[2,4,6,8,10,12,14,16,18,20]
在函数式编程语言中,状态是不可变的。这意味着一旦一个变量被绑定了一个值,它将不能再被从新定义。这在防止反作用与条件竞争上有明显的优点,使并发编程更简单。
和上面同样,让咱们使用 Elixir 来讲明一下这概念:
iex> tuple = {:ok, "hello"} {:ok, "hello"} iex> put_elem(tuple, 1, "world") {:ok, "world"} iex> tuple {:ok, "hello"}
这个例子中,tuple 的值历来没有改变过,第三行 put_elem 是返回了一个彻底新的 tuple, 而没有去修改原有的值。
做为一个程序员,咱们生活在激动人心的时代,云端的承诺已经兑现。与此同时,咱们每一个人都能获取史无前例的计算机资源。不幸的是,随之带来的扩展性、性能、并发性的需求。
面向对象编程根本不能简单的解决这些需求,尤为是在处理并发和并行计算的时候。尝试添加并发性和并行性,只会使语言增长它的复杂性,以及差的性能表现。
函数式编程在另外一方面是很是适合这些挑战的,不可变状态、闭包和高阶函数等概念,在对于编写高度并发和分布式应用程序而言,它们很是适合。
你能够经过查看“WhatsApp和Discord”等创业公司的技术资料,找到足够的证实:
这些公司和团队可以处理这种巨大的增加,要感谢函数式编程的优点。随着函数式编程获得愈来愈多的认同,我坚信像 WhatsApp 和 Discord 的例子会愈来愈广泛。