如果你花大量的时间阅读互联网上的编程趋势,你就会听说函数式编程。这个词经常被提及,但它是什么意思呢?
即使您知道什么是函数式编程,您也可能不清楚哪些语言最适合它。毕竟,并非所有的编程语言都是平等的。虽然您可以在许多语言中应用函数式编程范例,但仍有一些地方您会感觉舒服得多。
如果你有数学背景,那么你在函数式编程方面就有了先机。这是因为函数式编程范式将计算视为数学函数。如果你没有数学背景,这会让你感到困惑。
基本上,函数式编程将函数和数据视为不可变的。将数据传递到函数中,它通常会返回已转换的数据或其他类型的数据。在函数式编程中,函数不应改变原始数据或程序状态。
每个程序都应该做好一件事,这与Unix的理念有相似之处。函数不应该触及程序的各个部分。相反,它应该接受它的输入并给您一个输出。
理想情况下,函数在函数编程中应该尽可能的纯。这意味着给定相同的输入,函数的输出将始终保持不变。
这与面向对象编程有很大的不同。在面向对象编程中,通常有一个基本对象,它有各种方法专门用于更改作为该对象一部分的数据或状态。如果没有显式声明,方法甚至可以更改数据或状态。
在实际程序中,有时这是有意义的。也就是说,它会使程序更难维护,因为并不总是清楚是什么在改变状态或数据。函数式编程最初用于学术环境,但也可以帮助防止此类问题。
一些编程语言允许函数式编程,而另一些语言则鼓励甚至强制函数式编程。JavaScript属于第一类。虽然您可以在语言中使用函数式编程范式,但也可以轻松地使用面向对象的方法。
也就是说,JavaScript中内置了很多函数式编程范例。以高阶函数为例。这些函数可以将其他函数作为参数。
JavaScript有几个与数组一起工作的函数,比如
map(),
reduce(),
filter(),以及其他,所有这些都是高阶函数。这使您可以将它们链接在一起,以便使用数组快速执行各种操作。
虽然早期的JavaScript在可变性方面存在一些问题,但ECMAScript标准的较新版本提供了修复。而不是包罗万象
var定义变量的关键字,现在
c***t和
let. 第一个允许您定义常量,顾名思义。第二次,
let,将变量的作用域限制为声明它的函数。
与JavaScript一样,Python是一种通用语言,您可以使用任意数量的编程范式。Python可能有它的缺点,但函数式编程不是其中之一。官方Python文档中甚至有函数式编程的介绍。
首先,你会发现许多相同的
map(),
filter(),
reduce(),以及上述内置的类似功能。与JavaScript一样,这些函数是高阶函数,因为它们将其他函数作为参数。在Python中,函数式编程以
lambda关键字。
可以通过几种方式使用lambda表达式。一种使用它的方法是作为简单函数的速记。当赋值给变量时,可以像调用标准Python函数一样调用lambda表达式。lambda表达式的真正优势在于将它们用作匿名函数。
匿名函数也可以用JavaScript和此列表中的其他语言工作。当与高阶函数一起使用时,它们特别方便,因为您可以当场定义它们。如果没有匿名函数,就必须将即使是简单的添加项也预先定义为定制函数。
与JavaScript和Python不同,Clojure可能不是家喻户晓的名字,甚至在程序员中也是如此。如果您不熟悉的话,Clojure是Lisp编程语言的一种方言,可以追溯到20世纪50年代末,它带来了一种非常特殊的方式来做事情,恰好非常适合函数式编程。
与其他Lisp方言一样,Clojure将代码视为数据。这意味着代码可以有效地改变自身。与其他Lisp方言不同,Clojure运行在Java平台上,并被编译成JVM字节码。这意味着它可以与Java库一起工作,不管它们是否用Clojure编写。
与此列表中以前的语言不同,Clojure是一种从头开始的函数式编程语言。这意味着它尽可能地提倡不变性,特别是在数据结构中。
Clojure并不期望所有的程序在数学上都是“可证明的”,但鼓励尽可能使用纯函数。
Elm是这个列表中较新的语言之一,它是一种纯函数式语言,最初由evanczaplicki在2012年设计。这种语言已经在web开发人员中流行起来,特别是在创建用户界面方面。
与此列表中以前的每个条目不同,Elm使用静态类型检查。这有助于确保没有运行时异常,而是在编译时捕获错误。这对用户来说意味着更少的可见错误,这是一个主要的优点。
Elm编译器以HTML、CSS和JavaScript为目标。与使用Clojure编写在Java上运行的程序一样,您也可以在Elm中编写使用JavaScript库的应用程序。
Elm和其他语言之间的一个主要区别是你不会找到泛型
filter(),
map(),以及类似的功能。相反,它们是由数据类型定义的,比如
List.map或
Dict.map.
Haskell是另一种静态类型的纯函数式语言。不像埃尔姆,哈斯克尔已经出现了一段时间。第一个版本的语言是在1990年设计的。最新的标准是Haskell 2010,而下一个版本计划在2020年发布。
正如我们已经探讨过的,Haskell纯粹的功能性意味着通过设计,功能不应该有副作用。这使得它非常适合解决现实世界中的问题,尽管函数式编程起源于学术界。
尽管Haskell缺乏主流的流行性,但它已经被广泛应用于一些项目中。Xmonad窗口管理器完全是用Haskell编写的。Pandoc也使用这种语言,它将不同类型的标记转换成其他格式。
标准
map(),
filter(),
reduce(),以及其他高阶函数,这些函数应该允许您将JavaScript或Python的概念引入Haskell。如果你想更多地了解这门语言,学习Haskell是一个受欢迎的起点。
如果你还不是一个经验丰富的程序员,上面的一些术语和语言可能看起来有些深奥。这很好,因为知道你不知道的是成为一个更好的学习者的第一步。
上面列出的一些语言对初学者来说比其他语言更好。看看我们为初学者提供的最佳编程语言列表。你会注意到这两个列表之间有些交叉。
如果您感兴趣,请查看我们的指南,了解如何构建一个简单的PHP网站。
...重于程序应该如何实现结果。 编程范例用于根据特性对编程语言进行分类。它还允许遵循某种模式或风格来解决特定问题。 目录 1. 概述和主要区别 2. 什么是声明式编程 3. 什么是命令式编程 4. 并排比较-以表格形式的声明式编...
...建计算机程序的结构和元素的风格。编程范例有助于根据编程语言的特征对其进行分类。编程语言可能会影响更多的范例。在面向对象的范例中,程序是用对象构造的,而对象是用方法传递消息的。逻辑程序设计只能用数理逻辑...
关键区别–垃圾收集器与析构函数 大多数编程语言都支持面向对象编程。它是一种使用对象构建程序或软件的方法。对象是使用类创建的,因此它是类的实例。类提供对象应该由什么组成的描述。创建对象时,会为对象分配...
... 把代码气味看作是任何暗示某段代码应该被重构的迹象。这并不是因为代码有缺陷或者没有功能——通常情况下,有臭味的代码运行得很好——而是臭味的代码通常很难维护和扩展,这可能会导致技术问题(...
...汇编是由一系列执行任务的简单命令组成的,被称为低级编程语言。编写复杂的程序是可能的,但是很难表达抽象的概念,而且需要大量的考虑。 ...
...内置的最强大的构建块之一是数组。数组通常存在于许多编程语言中,用于存储数据。 ...
... 你有没有想过为什么函数是这么多编程语言的基石?让我们看看为什么它们如此重要,以及它们为程序员做了什么。 ...
字符串是许多编程语言(包括PHP)中的基本标量类型之一。它们表示从单个字符到整个文档的文本数据。 ...