函数式编程之根-λ表达式(lambda expression)

学习函数式编程的大图(big map)/鸟瞰图,并在没有掌握Scheme的各种语言细节之前,给出Scheme代码。这意味着我们不需要看懂源代码,而是将这里的介绍作为后续学习的大图,使自己知道身在何处;

1930s初,普林斯顿大学的逻辑学家阿伦佐·丘奇 (Alonzo Church,1903-1995) 开发出了一种新的形式系统(formal system),即拉姆达运算/演算 (λ-calculus 、lambda calculus ,lambda即希腊字母λ)。

λ运算的核心是λ表达式,以此形成函数定义、函数应用和递归的形式系统。当使用λ表达式定义出布尔值、数值和各种基本操作符等语言元素后,就能够形成一种编程语言,所以,λ运算是函数式编程语言共同的祖先,典型代表是Lisp(Scheme)、ML、Haskell和Erlang等等。

由于任何一个可计算函数都能用λ运算来表达和求值,因而它等价于图灵机。

0.1.1λ表达式

普通的数学函数如f(x)=x+1,功能是给其参数x加上1。为了将数学函数表示成计算机常用的表达式,可以换一种写法:

λx.( x+1),读成“对于参数x,x+1”(假定操作符+已经被定义)。丘奇选择了λ,因此各种相关计算称为λ演算。

各种编程语言,也引入了λ表达式。例如:

C#语言:(x) =>{ return x+1; }

Java语言:(x) ->{ return x+1; }

Scheme语言:(lambda (x) (+ x 1))

1. λ表达式的定义

λ表达式极其简洁,由变量、两个抽象符号λ和.(即点),以及括号( )组成。合法的λ表达式的递归定义如下:

  • 变量x是一个λ表达式。
  • 函数抽象:W是参数为变量x的λ表达式,则λx.W是λ表达式。这种表达式给出了一个函数的定义:W是函数体,形参就是变量x。

    λx.( x+1)

    λx. λy. ( x+y) ;;;表示 λx. (λy. ( x+y))

  • 函数应用:有了f(x)=x+1,自然需要计算f(2),即给函数一个(实际)参数进行求值。A、B是λ表达式,则 (A B) 也是λ表达式,表示将实参B带入函数A中。

通常,编程语言会提供内置的基本函数,如各种操作符。操作符的应用“是一种”函数应用,从λ表达式的递归定义的角度,“函数应用”规则可以得更直接的一条规则:

  • 操作符和λ表达式组成的表达式,是λ表达式。如x+1

下面是一些λ表达式的例子:

(最简单的)x、y、

(函数抽象)λx.x、λx.y、

(函数应用)λx.x y、(x y)、λx. (x y)……

2.λ表达式的特点

从λ表达式的定义,可以引申出它的两个特点:

  • 匿名函数。数学函数如f(x)=x+1或λ表达式如λx.( x+1),描述了一个计算过程;为该函数命名,是程序员的事情。
  • 每个函数只有一个输入参数,如λn. λm.λf.λx. ((n f)  (++ m) )。编程时函数可以有一个参数列表,逻辑学家 Haskell Curry证明可以将一个拥有多个参数的函数转化为只有一个参数的多个函数的连续调用,这一转化过程称为对拥有多个参数的函数的currying/柯里化

3.通过丘奇数,熟悉λ演算的α-变换和β简化。

时间: 2024-09-30 13:30:40

函数式编程之根-λ表达式(lambda expression)的相关文章

Java8函数式编程 (一) 数据流和lambda表达式

JDK 1.8中引入了函数式编程(functional programming,FP),如果您已习惯OOP,一定会感到困惑:什么是函数式编程?这样的编程模式有什么好处? 本文将通过简单的实例令读者对函数式编程有一个大体的了解. 我们知道OOP是以类为基础的,程序中必须首先抽象和定义class.那么FP创建的基础是什么?或者说在Java 8中,至少需要了解什么知识点才能实现基本的函数式编程呢? 本文将首先介绍在Java 8中使用FP所需的基本知识点: Lambda表达式 数据流 基本实例 Map<

Python笔记第3章,模块和模块的常用方法,函数式编程yield,三元运算Lambda表达式,内置涵数,常用模块

<--目录--> 模块和模块的常用方法 函数式编程 yield 三元运算 Lambda表达式 内置涵数 常用模块 [模块和模块的常用方法]至关重要的__init__.py    #包一定要有这个__init__.py文件,他才是包,这样才能通过form 包名 import 模块名(.py文件名)来去引用这个包的某个模块的某个函数功能 判断是否为主文件:__name__ if __name__ == '__main__' 当前文件路径: __file__ 当前文件描述: __doc__ 1)if

Python函数和函数式编程(2): 匿名函数--lambda

原文地址:http://blog.csdn.net/majianfei1023/article/details/45269343 一. lambda函数: lambda函数也叫匿名函数,函数没有具体的名称.先来看一个最简单例子: def f(x): return x * 2 g = lambda x : x * 2 看一下 f 和 g的写法有什么不同,f是定义了一个函数,传进去一个参数x,然后x*2,g是定义了一个lambda,后面跟着一个x(这个就是参数),然后跟着一个 : x * 2 (这就

C++11 lambda表达式(lambda expression)

1.可调用对象(callable object)类别包括: 函数 函数指针 重载了函数调用运算符的类 lambda 表达式 2.lambda表达式形式: [capture list] (parameter list) -> return type { function body } capture list (捕获列表)是一个 lambda 所在函数中定义的局部变量的列表(通常为空),空捕获列表表明此 lambda 不使用它所在的函数中的任何局部变量, return type.parameter

Python的函数式编程,从入门到?放弃?

转:http://python.jobbole.com/84927/ 很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵光一闪,就选定函数式编程这个主题吧,反正组里的同事都没有学过,只需要讲解入门方面的知识就好,也正好可以借这个机会逼迫自己去学习下这种新的编程方式. 经过初步了解,发现支持函数式编程的语言挺多的,除了像Lisp.Scheme.Haskell.Erlang这样专用的函数式编程语言,我们常

Python的函数式编程

Contents 1. 目标 2. 命令式编程 & 函数式编程 3. Python函数式编程的基本单元 3.1. lambda 3.2. map() 3.3. reduce() 3.4. filter() 4. 替换条件控制语句 5. 替换循环控制语句 5.1. 替换for循环 5.2. 替换while循环 6. 更多示例 7. 总结 8. 参考链接 很早以前就听说过了函数式编程,印象中是一种很晦涩难懂的编程模式,但却一直没有去进行了解. 恰好这周组内的周会轮到我主持,一时也没想到要分享什么.灵

傻瓜函数式编程

傻瓜函数式编程 FP 说明 转载,github.com/justinyhuang 2006年6月19日,星期一 开篇 我们这些码农做事都是很拖拉的.每天例行报到后,先来点咖啡,看看邮件还有RSS订阅的文章.然后翻翻新闻还有那些技术网站上的更新,再过一遍编程论坛口水区里那些无聊的论战.最后从头把这些再看一次以免错过什么精彩的内容.然后就可以吃午饭了.饭饱过后,回来盯着IDE发一会呆,再看看邮箱,再去搞杯咖啡.光阴似箭,可以回家了-- (在被众人鄙视之前)我唯一想说的是,在这些拖拉的日子里总会时不时

漫漫人生路,学点Jakarta基础-Java8函数式编程

接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而是具有特定逻辑的实例方法. 举例说明:定义接口Animal,其中包含默认方法eat(). /** * Created by zjc on 2018/4/9. */ public interface Animal { void call(); default void eat() { System.o

001 java为什么需要函数式编程

一 .概述 集合是我们java程序员每天都需要的工具,没有了集合,java程序员几乎不能干任何的事情,我们每天的工作也是在对集合进行不同的操作. 尽管集合的功能已经足够强大,但是当我们面对复杂的业务问题的时候,利用原始的集合操作就会变得让人恶心. 于是在java8之中出现了lambda和stream的API,为我们以一种更加优雅的方式使用集合. 没错,就是集合,当我们现在使用NOSQL,各种日志分析,等等的大数据操作的时候,我们不可能使用原始的数据库的sql操作帮助我们完成如排序,求和,分组等操