前言
最近看一本叫做《计算的本质》的书,这本书主要说了一些底层计算方面的知识。可以说它刷新了我的三观,而当今天看到可以使用Y组合子来实现递归的时候我的世界观基本崩塌了。故借着七夕来写一篇文章总结一些关于计算的一些基本认识。以便后续可以更好地学习。也借着Ruby的语法来阐述一下关于Lambda的一些故事。
0. 题外话
为了庆祝一下这个七夕节日,我提前关掉了LOL,打开了Emacs,敲下如下代码(这里顺便推广一下Ruby的单件方法)
subject = "情侣"object = "狗"def subject.do_something(who) "#{self} 虐 #{who}"endif __FILE__ == $0 p subject.do_something(object) p object.do_something(subject)end
上面代码的运行结果是
"情侣 虐 狗"dog.rb:11:in `<main>': undefined method `do_something' for "狗":String (NoMethodError)
很明显,情侣可以“虐”狗但狗不能“虐”情侣。因此第二句执行语句会报错。以上也是Ruby优雅的地方,我可以直接在指定实例上定义方法,而不影响其他其他的同类的实例(以上实例都是字符串)。
1. 函数的一些基本认识
“题外话”有个卵子用?额, 说没用,它还是有一点作用的。我们今天的主题是用Ruby来模拟Lambda演算。Lambda演算在Wiki上面的解释是这样的
Lambda演算可以被称为最小的通用程序设计语言。它包括一条变换规则(变量替换)和一条函数定义方式,Lambda演算之通用在于,任何一个可计算函数都能用这种形式来表达和求值。
平时我们使用命令式的编程语言会更倾向于关注字符串, 数字,布尔 这些可以充当主语或者宾语的类型。而我们平时跟他们打交道更多会以变量的形式,就如同“题外话”中的"狗"和"情侣"。但这篇文章的重点放在"虐"这个词上,也就是我们常称的谓语。在计算机里面我们通常称他做方法 或者 函数。
既然Wiki上也说了Lambda是最小的通用程序设计语言,那我们有没有可能用Lambda来模拟出数字, 字符串, 布尔等等的这些常用的数据类型呢?这就是接下来要讲的东西。
1) Ruby中的函数
在Ruby中,函数其实可以算是一等公民,只是它的锋芒往往被Ruby强大的面向对象特征给掩盖掉了(它使得我们更多地关注类还有模块)。Ruby里面有个十分简单的创建函数的方式
[1] pry(main)> -> x { x + 2 }=> #<Proc:0x007fc171dc6010@(pry):1 (lambda)>
它返回了一个Proc对象。其实这个对象,就类似于我们平时操作的函数对象。但是这里我们并没有给函数赋予名字,可以理解为它是一个匿名函数。那么这种函数如何调用呢?有一种很语义化的调用方式,我们甚至不需要用变量来接受这个函数就可以调用它。
新闻热点
疑难解答