离散数学: 能否举一个"Lamda"演算的实际应用的例子?
悬赏分:0 - 解决时间: 2009年08月06日 23时35分
Lamda演算的实际应用的例子,解决一个实际的问题,越简单越直观越好
理论总是太抽象,实际问题的解决才算具体。谢谢!!!!!!
提问者:
z6t -
中级魔法师 六级
最佳答案
Lambda
首 先介绍 Lambda。许多非常精彩、非常重要、也非常困难的概念,随着时间发展,慢慢变成了日常生活中丝毫不引起人注意的事情。比如火和轮子这样关系到人类文明 进程的重大发明,数字"零"的发现,等等。计算机科学里面也是如此。计算机科学发展的幼儿时期,数理逻辑中的 s-m-n 定理和通用图灵机等的发现,都被认为是重要成果,可是今天,许多熟悉电脑的中学生都知道,用软件模拟通用计算机是可能的。关于 Lambda 演算的理论也差不多是这样。
如果不是专门研究 Lambda 演算的理论,Lambda 对于今天的程序员来说,几乎是个透明而不可见的概念。实在是太普通,都很难把它说的有趣一点,或者看上去深奥一点。因为所谓Lambda,其实就是表达了 区区一个"函数"的概念而已。不过,在 Scheme 里面,Lambda 还是表达了两个值得注意的重要特征。第一个,就是广泛的允许匿名对象的存在。这很难说和正宗的 Lambda 演算的理论有特别的联系,它更像是由 Lambda 演算的理论所衍生出来的编程风格。第二个特征,就是所谓的高阶函数。这个特征和 Lambda 演算理论息息相关。高阶函数是 Lambda 演算理论的精髓,是由 Lisp 首先介绍到程序语言这个世界的。也是大量的现代语言,比如流行的 Python 当中一个似乎是不那么引人注目的特征。
下面我们分头介绍这两个和 Lambda 演算理论紧密相关的 Scheme 特征。
高阶函数
Python 发明人 Guido van Rossum 和 Fred Drake 编写的 Python Tutorial 第 4.6 节列举了下面的例子。
>>> fib
<function object at 10042ed0>
>>> f = fib
>>> f(100)
1 1 2 3 5 8 13 21 34 55 89
对 于事先不了解 Lambda 演算理论的读者朋友来说,第一次看到上面例子的时候,哪会想到背后深刻的理论基础和悠久的历史发展呢?这似乎就是公路上数不清的普通的轮子当中的普通的又 一个而已,谁会想起生活在石器时代的我们的先祖们第一次看到这个滚动的玩意儿的时候是怎样的兴奋呢?不过,计算机科学就是不一样,如果你当真想亲眼看到有 人对"轮子"发出由衷的赞叹的话,可以找一个 C 或者 Pascal 语言的程序员来碰碰运气。不过,如果你的运气实在不好,也许会听到类似下面的话的哦。"轮子?没有我家的小叫驴好呀!"
玩笑说了这么多,我们下面讲点干巴巴的"理论"。^_^
高 阶函数有两点内容。第一是让函数对象成为程序语言当中所谓"第一等公民"。我们所说程序语言当中的"第一等公民",指的是可以对这样的数据对象进行赋值、 传递等操作。就像我们可以对整数型变量所做的那样。如果函数对象也是程序语言当中的第一等公民,我们就可以像上面列举的 Python 的例子那样,把函数对象在变量之间进行赋值和传递等操作。
高阶函数的第二点内容是像下面这样。既然函数本身,就像整数或者浮点数那样,成 了我们所谓"第一等公民",我们当然就希望可以像以前能够做的那样,在我们需要的时候,把所有这些"第一等公民",拿在手上揉来揉去、捏来捏去,无论它们 是整数型数据、或者是浮点型数据、还是函数型数据。我们要把它们这样变换过来,再那样变换过去。把这些"第一等公民"放到我们的变换函数里面,对它们进行 任意的、我们所需要的各种各样的操作。换句话说,我们可以像对待整数和浮点型数据那样,把函数本身也作为某个函数的输入数据和输出数据。也就是说,我们的 函数可以对函数本身进行操作。这些可以操作别的函数的函数的地位不就是更高级了吗?这就是所谓"高阶"这个词的由来。
匿名函数
除 了高阶函数这个本质性的东西以外,Lambda 在 Scheme 里面还代表了一种原则。这个原则就是把程序语言中的对象和对象的名字分离开,并且允许存在匿名对象。对于和 Lambda 直接相关的"函数"这个概念来说,就是允许存在匿名函数。函数可以没有名字,在我们需要的时候,又可以给它加上名字。这更多的是一种需要程序语言提供支持 的编程风格。这个所需要的支持,就是对上面所说"高阶函数"的支持。确实有一些程序语言在实现高阶函数的时候,却没能够提供对匿名函数的支持。这的确是一 个有趣的现象。当然,在这样的语言中加上对匿名函数的支持是轻而易举的。
把数据对象和变量名称剥离开来的原则,对于程序员来说,是非常大 的解脱。就像 Lisp 和 Scheme 程序员视为当然的自动内存管理一样,这也是一个 Lisp 和 Scheme 程序员享受了很久的东西,可是 Lisp 这个圈子外的程序员直到最近,才开始接触到这些概念。要知道, Lisp 据说是自 Fortran 以来,第二个最古老的语言哦。像自动内存管理这样的技术,直到上世纪九十年代中后期,才开始被 Lisp 圈子外的程序员所了解。而这其实是 Lisp 程序员自上世纪六十年代以来,就一直在享受的东西。
在以后的例子里面将会具体的看到用 Lambda 定义匿名函数的例子。到时候,我们将有机会看到这样的匿名函数对于编程来说,是多么方便。
参考资料:
http://historyasamirror.bokee.com/2486584.html