Skip to content
字数
1078 字
阅读时间
5 分钟

https://github.com/justinyhuang/Functional-Programming-For-The-Rest-of-Us-Cn/blob/master/FunctionalProgrammingForTheRestOfUs.cn.md

一般,1. **SQL(结构化查询语言)和2. HTML(超文本标记语言)是声明式编程 java和汇编是命令式编程

目前为止,我们已经看到了函数式编程的两个原则:

  1. 不要更改变量或对象​——创建新变量和对象,并在需要时从函数返回它们。
  2. 声明函数参数​——函数内的任何计算仅取决于参数,而不取决于任何全局对象或变量。

2. λ演算的核心概念与函数式编程

1. 函数抽象和应用

  • λ演算的最基本元素就是函数定义(λ抽象)和函数应用。这与函数式编程中的函数定义和调用几乎完全对应。
    • 在 λ演算中,函数的定义是 λx. E,表示一个函数接受 x 作为参数,返回 E 的结果。
    • 在函数式编程语言中,函数的定义也是通过类似的方式实现的,如 f(x) = x + 1
  • 函数的应用在 λ演算中是通过将函数和参数结合来执行的,即 (λx. x + 1) 5,结果是 6

2. 无副作用(纯函数)

  • λ演算中的函数是纯粹的,没有副作用——即函数的输出只依赖于输入,不会改变任何外部状态。这正是函数式编程的核心理念之一,函数式编程强调使用纯函数,避免修改变量和全局状态。

3. 高阶函数

  • 在 λ演算中,函数是第一类对象,意味着你可以像操作数据一样操作函数(将函数作为参数传递或返回)。这一特性与函数式编程中的高阶函数概念完全一致。
  • 例如,λ演算中你可以定义一个接受另一个函数作为参数的函数,如 λf. f (f x),这与函数式编程中的高阶函数(例如 mapfilter)非常相似。

4. 递归

  • 递归是 λ演算和函数式编程中的一个重要特性。λ演算可以通过自引用函数(递归函数)来表达循环和递归计算,而函数式编程语言也鼓励使用递归来替代传统的循环结构。
  • 在 λ演算中,递归可以通过 Y 组合子来实现,这是一种非常巧妙的递归技巧,使得 λ演算能够表示递归函数,而无需显式地定义递归。

5. 柯里化(Currying)

  • 柯里化是 λ演算中的一个概念,它表示将一个多参数函数转换成一系列单参数函数的形式。
  • 在 λ演算中,柯里化表现为函数的链式应用:λx. λy. (x + y) 就是一个典型的两参数函数,其功能可以通过 λx. (λy. (x + y)) 来实现。这与函数式编程中的柯里化非常相似,很多函数式语言(如 Haskell)都使用柯里化作为函数应用的默认方式。

3. λ演算在函数式编程中的应用

  • 函数定义与组合:λ演算鼓励通过函数的定义和组合来解决问题,而不是通过命令式编程中的改变状态或使用变量。
  • 递归和尾递归:函数式编程广泛使用递归,λ演算则为递归的形式化提供了支持,特别是在没有传统循环结构的情况下。
  • 高阶函数和匿名函数:λ演算中的匿名函数(即没有名字的 λ 表达式)与函数式编程语言中的匿名函数(如 JavaScript 的箭头函数)非常相似。
  • 闭包:λ演算的函数是闭包,它包含了对外部环境的引用,这与函数式编程中的闭包概念一致。

贡献者

The avatar of contributor named as sunchengzhi sunchengzhi

文件历史

撰写