前言
最近看一本叫做《計算的本質》的書,這本書主要說了一些底層計算方面的知識??梢哉f它刷新了我的三觀,而當今天看到可以使用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對象。其實這個對象,就類似于我們平時操作的函數對象。但是這里我們并沒有給函數賦予名字,可以理解為它是一個匿名函數。那么這種函數如何調用呢?有一種很語義化的調用方式,我們甚至不需要用變量來接受這個函數就可以調用它。
新聞熱點
疑難解答