2018 年你应该学习函数式编程

2025-06-08

2018 年你应该学习函数式编程

函数式编程已经存在很长时间了,从 50 年代Lisp编程语言的引入开始;如果你在过去两年里一直关注的话,像ClojureScalaErlangHaskellElixir这样的语言已经引起了很大的轰动并获得了大量的关注。

但是,函数式编程到底是什么?为什么每个人都对它如此着迷?为什么没有更多的人使用它呢?在这篇文章中,我将尝试回答所有这些问题,并希望能激起你对函数式编程的兴趣。

函数式编程简史

正如我们之前所说,函数式编程始于 50 年代,当时 Lisp 语言被应用于IBM 700/7000 系列科学计算机。Lisp 引入了许多如今与函数式编程相关的范式和特性。虽然我们可以称Lisp为函数式编程的鼻祖,但我们甚至可以进一步追溯到所有函数式编程语言的共同根源——Lambda 演算

啊,美好的旧时光

这是迄今为止函数式编程最有趣的方面;所有函数式编程语言都基于相同的简单数学基础,即Lambda 演算

Lambda 演算具有图灵完备性,也就是说,它是一种通用的计算模型,可以用来模拟任何单带图灵机。[1] 它的名字来源于希腊字母 lambda (λ),在 lambda 表达式和 lambda 项中用于表示在函数中绑定变量。——维基百科

Lambda 演算是一个出奇简单却又强大的概念。它的核心有两个概念:

  • 函数抽象,通过引入名称(变量)来概括表达式。
  • 函数应用,通过为特定值命名来评估广义表达式。

让我们看一个例子,一个单参数函数f将参数增加一:

f = λ x. x+1
Enter fullscreen mode Exit fullscreen mode

假设我们想将函数应用于数字 5;那么该函数可以读作如下:

f(5) => 5 + 1
Enter fullscreen mode Exit fullscreen mode

函数式编程基础

数学知识已经足够了,现在让我们看一下函数式编程之所以成为一个强大概念的特性:

一等函数

在函数式语言中,函数是一等公民,这意味着函数可以存储在变量中,例如在 elixir 中看起来像这样:

double = fn(x) -> x * 2 end
Enter fullscreen mode Exit fullscreen mode

因此我们可以轻松地调用该函数,如下所示:

double.(2)
Enter fullscreen mode Exit fullscreen mode

高阶函数

高阶函数定义为接受一个或多个函数作为参数,并且/或者返回一个新函数的函数。我们再次使用 double 函数来举例说明这个概念:

double = fn(x) -> x * 2 end
Enum.map(1..10, double)
Enter fullscreen mode Exit fullscreen mode

在这种情况下,Enum.map将一个可枚举的列表作为第一个参数,将我们刚刚定义的函数作为第二个参数;并将该函数应用于可枚举中的每个元素,结果如下:

[2,4,6,8,10,12,14,16,18,20]
Enter fullscreen mode Exit fullscreen mode

不可变状态

在函数式编程语言中,状态是不可变的,这意味着一旦变量绑定到某个值,就不能重新定义它们,这具有防止副作用和竞争条件的优点;使并发编程变得更加容易。

和以前一样,让我们​​使用 Elixir 来说明这个概念:

iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> put_elem(tuple, 1, "world")
{:ok, "world"}
iex> tuple
{:ok, "hello"}
Enter fullscreen mode Exit fullscreen mode

在示例中,我们的元组永远不会改变值,在第三行中,put_elem 返回一个全新的元组,而不会修改原始元组的值。

我不会深入探讨细节,因为这篇文章并非介绍 Lambda 演算、计算理论,甚至也不是函数式编程;如果你想让我更深入地探讨任何一个主题,请在评论区留言。目前,我们从本节中总结的内容如下:

  • 函数式编程已经存在很长时间了(50 年代早期)
  • 函数式编程基于数学概念,特别是 Lambda 演算
  • 与命令式语言相比,函数式编程被认为太慢
  • 函数式编程正在卷土重来。

函数式编程应用

作为软件开发者,我们正生活在一个激动人心的时代,云计算的前景终于到来,随之而来的是前所未有的强大计算能力,人人皆可享用。然而,随之而来的是可扩展性、性能和并发性的挑战。

面向对象编程已经不再适用,特别是在并发并行方面;尝试为该语言添加并发和并行会增加很多复杂性,并且往往导致过度工程和性能不佳。

另一方面,函数式编程已经非常适合这些挑战,不可变状态、闭包和高阶函数,这些概念非常适合编写高度并发和分布式应用程序。

但不要轻信我的话,你可以通过查看 WhatsApp 和 Discord 等初创公司的技术信息找到足够的证据:

  • WhatsApp通过使用Erlang ,仅用团队中的50 名工程师就能够支持 9 亿用户
  • Discord以类似的方式使用Elixir每分钟处理超过一百万个请求

这些公司和团队能够利用函数式编程的优势来应对这种巨大的增长,并且随着函数式编程越来越受到关注,我坚信像 WhatsApp 和 Discord 这样的故事会变得越来越普遍。

因此,函数式编程必须成为每个开发人员知识工具箱中的必备知识,您需要准备好构建下一代应用程序,为下一个十亿用户提供服务;如果这还不够,相信我,函数式编程真的很有趣,只要看看Elixir就知道了:

最后,如果您有任何意见、更正或想要了解有关该主题的更多信息,请随时在下面发表评论。

鏂囩珷鏉ユ簮锛�https://dev.to/allanmacgregor/you-should-learn-function-programming-in-2018-4nff
PREV
立即成为更好的开发人员:快速致胜
NEXT
注意数组 - V8 引擎建议