λ (Lambda)

什么是函数式编程?

函数式编程是一种计算机编程范式,它依赖于模仿数学上的函数。函数式编程本质上是组合各种表达式,表达式包括一些值,变量和函数,函数会应用一些输入参数,然后会进行一些计算,一般会有返回值,函数式编程语言是基于 lambda 演算的。

函数的透明引用(Referential transparency):对于同一个函数,给它相同的参数,然后同样的返回值,表现的像数学上的函数一样。

什么是函数?

如果不用lambda这个词,可能大概知道函数是什么了。函数会用入参和返回值,函数定义了它的入参是什么,然后它的返回值是什么,例如一个加法函数(add),有两个入参,有一个和的返回值。又例如我们有一个函数名为 f,有下面如下关系:

f(1) = A
f(2) = B
f(3) = C

输入的参数的集合是 {1, 2, 3}, 输出的集合的参数是 {A, B, C}, 一个重点是这些关系是怎么定义的,假设当入参是 1 的时候,函数的返回值一定是 A, 而不会出现 f(1) = Xf(1) = Z 这些情况。在前面提到的透明引用,当一个函数有相同的入参,返回值一定是相同的。下面的情况也是满足的,因为对于相同的入参,返回值是确定的,只不过是它们返回值刚好相同了

f(1) = A
f(2) = A
f(3) = A

lambda 结构

lambda 含有:表达式(expression), 变量 和 抽象(abstraction)。expression 可以和变量和抽象,或者它们的组合。expression 可以是变量,这个变量有个名称,但是可以是函数的名称

abstractions 有两部分,head 和 body, head 是 λ(lambda),接着是变量名,body 是函数的其他表达式,如下:

λx.x

lambda λx.x 没有名字,它是一个匿名函数

ch1_1.png

α 等价 (Alpha equivalence)

这里的变量 x 没有什么特别的意思,它就是一个表示,可以替换成 y 或者 z, 它们都是同一个函数的,这里称这种为 α 等价

λx.x
λy.y
λz.z

β 化简 (Beta reduction)

当函数应用入参的时候,会把入参的表达式替换 body 内相应的值,消除 head 相关的入参,提供一个绑定变量的作用,这个过程称为 β 化简,例如

𝜆x.x

进行 β 化简,应用 2 替换 x,得到

(𝜆x.x)2
      2

Free variables

y 在 body 内,但是没有出现在 head 中,进行参数绑定,y 称为 Free variables

(𝜆𝑥.𝑥𝑦)𝑧
zy

Combinators

body 内出现的变量,在 head 参数中都出现过。就是 Combinators

最后

  • 函数式编程基于表达式,它们可以包含变量,常量值,表达式组合其他表达式和函数
  • 函数有 head body,表达了它需要的参数,和如何进行计算,返回结果
  • 入参变量作为参数替换 body 出现位置相关的地方。都会生成同一个值
  • 函数有一个或多个入参或返回值
  • 函数把入参映射到返回值,对于同一个入参有相同返回值
  • lambda 形如匿名函数 (𝜆𝑥.𝑥 + 1)
  • lambda 演算是表达程序的抽象过程和应用

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 19,023评论 17 410
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,878评论 0 38
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,259评论 9 118
  • 注:之前关于Java8的认知一直停留在知道有哪些修改和新的API上,对Lambda的认识也是仅仅限于对匿名内部类的...
    mualex阅读 2,846评论 1 4
  • 每个人一出生就开始了一场一生的修行,每个人都有涅槃成佛的机会。但每个人最后是否能成佛就不一定了。 我不相信有来生,...
    叶子笑了阅读 308评论 1 0