什么是函数式编程? 示例教程

什么是函数式编程?

函数式编程(也称为 FP)是一种通过创建纯函数来思考软件构造的方法。它避免了面向对象编程中观察到的共享状态、可变数据的概念。

函数式语言侧重于表达式和声明,而不是语句的执行。因此,与依赖于局部或全局状态的其他过程不同,FP 中的值输出仅取决于传递给函数的参数。

函数式编程的特点

  • 函数式编程方法注重结果,而不是过程
  • 重点是要计算的内容
  • 数据是不可变的
  • 函数式编程 将问题分解为“函数”
  • 它建立在数学函数的概念之上,使用条件表达式和递归来执行计算
  • 它不支持像循环语句这样的迭代和像If-Else这样的条件语句

函数式编程的历史

  • 函数式编程的基础是 Lambda 演算。它是在 1930 世纪 XNUMX 年代开发的,用于函数式应用、定义和递归
  • LISP 是第一个函数式编程语言。麦卡锡于 1960 年设计
  • 70年代末爱丁堡大学的研究人员定义了ML(元语言)
  • 在 80 年代初,Hope 语言添加了用于递归和方程推理的代数数据类型
  • 2004年函数式语言“Scala”的创新。

函数式编程语言

任何 FP 语言的目标都是模仿数学函数。然而,函数式编程的基本计算过程有所不同。

以下是一些最著名的函数式编程语言:

  • 哈斯克尔
  • SML
  • Clojure的
  • 斯卡拉
  • Erlang
  • 清洁
  • F#
  • ML/OCaml Lisp / 方案
  • XSLT
  • SQL
  • 数学

基本函数式编程术语和 Concepts

基本函数式编程术语和 Concepts

不可变数据

不可变数据意味着您应该能够轻松创建数据结构,而不是修改已经存在的数据结构。

参考透明度

函数式程序应该像第一次一样执行操作。因此,您将知道程序执行期间可能发生或可能未发生的情况及其副作用。用 FP 术语来说,这称为引用透明度。

模块化

模块化设计提高了生产率。小模块可以快速编码,并且有更大的重复使用机会,这无疑会加快程序的开发速度。除此之外,模块可以单独测试,这有助于您减少单元测试和调试所花费的时间。

可维护性

可维护性是一个简单的术语,这意味着 FP 编程更容易维护,因为您无需担心意外更改给定函数之外的任何内容。

一流的功能

“一流函数”是一个定义,归因于对其使用没有限制的编程语言实体。因此,一流函数可以出现在程序中的任何位置。

关闭

闭包是一个内部函数,即使在父函数执行之后,它也可以访问父函数的变量。

高阶函数

高阶函数要么接受其他函数作为参数,要么将它们作为结果返回。

高阶函数允许部分应用或柯里化。这种技术一次将一个函数应用于其参数,因为每个应用程序都会返回一个接受下一个参数的新函数。

纯函数

“纯函数”是指其输入被声明为输入且不应隐藏任何输入的函数。输出也被声明为输出。

纯函数作用于它们的参数。如果不返回任何东西,效率就很低。此外,它为给定参数提供相同的输出

示例:

Function Pure(a,b)
{
	return a+b;
}

不纯函数

不纯的功能与纯的正好相反。它们有隐藏的输入或输出;称为不净。不纯函数不能单独使用或测试,因为它们具有依赖性。

例如:

int z;
function notPure(){
	z = z+10;
}

功能构成

函数组合是将两个或多个函数组合起来形成一个新函数。

共享状态

共享状态是 OOP 编程中的一个重要概念。基本上,它是向对象添加属性。例如,如果硬盘是对象,则可以将存储容量和磁盘大小添加为属性。

副作用

副作用是在被调用函数之外发生的任何状态变化。任何 FP 编程语言的最大目标都是通过将副作用与软件代码的其余部分分开来最大程度地减少副作用。在 FP 编程中,消除其余编程逻辑的副作用至关重要。

函数式编程的好处

  • 允许您避免代码中令人困惑的问题和错误
  • 更容易测试和执行单元测试和调试 FP 代码。
  • 并行处理和并发
  • 热代码部署和容错
  • 通过更短的代码提供更好的模块化性
  • 提高开发人员的生产力
  • 支持嵌套函数
  • 函数式结构,如惰性映射和列表等。
  • 允许有效使用 Lambda 演算

函数式编程的局限性

  • 函数式编程范式并不容易,因此对于初学者来说很难理解
  • 由于许多对象在编码过程中不断演变,因此难以维护
  • 需要大量的模拟和广泛的环境设置
  • 复用非常复杂,需要不断重构
  • 对象可能无法正确代表问题

函数式编程与面向对象编程

功能编程 OOP
FP 使用不可变数据。 OOP 使用可变数据。
遵循基于声明式编程的模型。 遵循命令式编程模型。
它的重点是:“你在做什么。在节目中。” 它关注的是“你是如何进行编程的”。
支持并行编程。 不支持并行编程。
其功能无副作用。 方法会产生许多副作用。
流程控制是使用函数调用和带有递归的函数调用来执行的。 流程控制过程是使用循环和条件语句进行的。
语句的执行顺序并不是很重要。 语句的执行顺序很重要。
支持“数据之上的抽象”和“行为之上的抽象”。 仅支持“数据抽象”。

结语

  • 函数式编程或 FP 是一种基于一些基本定义原则的软件构建思考方式
  • 函数式编程概念注重结果,而不是过程
  • 任何 FP 语言的目标都是模仿数学函数
  • 一些最著名的函数式编程语言:1)Haskell 2)SM 3) Clojure 4) Scala 5) Erlang 6) Clean
  • “纯函数”是指其输入被声明为输入且不应隐藏任何输入的函数。输出也被声明为输出。
  • 不可变数据意味着您应该能够轻松创建数据结构,而不是修改已经存在的数据结构
  • 允许您避免代码中令人困惑的问题和错误
  • 函数式代码并不容易,初学者很难理解
  • FP 使用不可变数据,而 OOP 使用可变数据