[PLT] 柯里化的前生今世(十一):Pure and Lazy

語言的作用

語言的作用是為了交流想法,描述概念贬墩,
當(dāng)前使用了什么語言榴嗅,取決于我們有什么樣的需要。

為了理解詞法作用域陶舞,閉包嗽测,和continuation,
前文中,我們借助了Racket唠粥。

現(xiàn)在疏魏,為了理解代數(shù)數(shù)據(jù)類型(algebraic data type),多態(tài)(polymorphism)晤愧,參數(shù)化類型(parameterized type)大莫,類型類(type class),我們要學(xué)習(xí)Haskell了官份。

編程也是如此只厘,它是關(guān)于思想的,
編程語言只是描述這種思想的工具罷了舅巷。


非嚴(yán)格語義(non-strict semantics)

在Haskell規(guī)范中羔味,并沒有要求使用惰性求值策略(evaluation strategy),
只是規(guī)定它是一種非嚴(yán)格的語言(non-strict language)悄谐,
具體的求值策略取決于實現(xiàn)介评。

那么,什么才能叫做non-strict呢爬舰?
non-strict與lazy有什么關(guān)系呢们陆?
還要從數(shù)學(xué)上函數(shù)的嚴(yán)格性(strictness)說起。

程序中的function與數(shù)學(xué)函數(shù)之間的關(guān)系情屹,
是指稱語義中的內(nèi)容坪仇。(指稱語義是形式語義的一種,它將每一段代碼垃你,與一個數(shù)學(xué)對象相對應(yīng)椅文,用來研究程序的含義。

在數(shù)學(xué)上惜颇,如果一個函數(shù)對定義域中的某些參數(shù)皆刺,沒有定義值,
就稱為該函數(shù)為部分函數(shù)(partial function)凌摄。


程序中的function羡蛾,對應(yīng)著數(shù)學(xué)上的部分函數(shù)。

此外锨亏,程序中某一類型的全體值痴怨,也不能簡單的對應(yīng)于數(shù)學(xué)上的集合,
例如器予,程序中的全體整數(shù)類型的值浪藻,并不對應(yīng)于整數(shù)集,
因為返回整型值的function乾翔,取某些參數(shù)時爱葵,程序可能不會終止。

為了給這樣的function和返回值找到指稱,
我們給每個集合增加一個新的值:钧惧,讀作bottom暇韧。

f(⊥) = ⊥

一個數(shù)學(xué)函數(shù),如果參數(shù)是浓瞪,那么結(jié)果就一定是
這樣的函數(shù)稱為嚴(yán)格函數(shù)(strict function)巧婶。

反之乾颁,如果參數(shù)包含,但是結(jié)果不一定是艺栈,
這樣的函數(shù)就稱為非嚴(yán)格函數(shù)(non-strict function)英岭。

如果程序語言中function的指稱語義是非嚴(yán)格函數(shù),
那么這樣的語言湿右,就稱為非嚴(yán)格的語言(non-strict language)诅妹。

注:
嚴(yán)格性是指稱語義中的概念,而求值是操作語義中的概念毅人。
并且指稱語義對于操作語義具有可靠性(soundness)吭狡,
即,如果一個表達(dá)式根據(jù)操作語義求值為另一個丈莺,那么划煮,它們必定具有相同的指稱。

因此缔俄,對于non-strict language弛秋,求值策略可能并不唯一,
對Haskell來說俐载,GHC是最流行的編譯器蟹略,
它使用了惰性求值(lazy evaluation)。

在沒有歧義的情況下遏佣,人們常用lazy暗指non-strict挖炬,
lazy更直觀更有利于溝通。

引用透明性

An expression is said to be referentially transparent if it can be replaced with its corresponding value without changing the program's behavior.

即贼急,引用透明性(referential transparency)指的是茅茂,
程序中的表達(dá)式總是可以用它的值來代替。

而程序中的純函數(shù)(pure function)太抓,指的是空闲,
(1)這個函數(shù)對相同參數(shù)總是輸出相同結(jié)果
(2)這個函數(shù)沒有副作用(side effect)
因此,純函數(shù)具有引用透明性走敌。

此外碴倾,語言采用了惰性求值,意味著表達(dá)式的求值方式是按需確定的,
所以跌榔,依靠副作用來得到計算結(jié)果就不可行了异雁,
我們不知道計算在什么時候發(fā)生。

因此僧须,一旦語言擁抱了惰性求值纲刀,就不得不保證引用透明性,
反之則不一定担平,具有引用透明性的語言示绊,可能不必是惰性求值的。

至于暂论,純函數(shù)是不是解決問題的最佳方式面褐,目前尚無定論,
但至少它是為了追求優(yōu)雅性取胎,對通常編程方式的一種挑戰(zhàn)展哭。

歷史上的純函數(shù)式惰性語言

在20世紀(jì)70年代末,Gerry Sussman和Guy Steele發(fā)明了Scheme闻蛀,它是Lisp的一個方言匪傍,與lambda演算很相似,并支持了詞法作用域循榆。
幾乎同時析恢,Robin Milner為了進(jìn)行自動定理證明發(fā)明了ML,其中使用了多態(tài)類型系統(tǒng)秧饮。
但是SchemeML都是基于嚴(yán)格語義的語言(strict language)映挂。

到了80年代,人們?nèi)计鹆藢Ψ菄?yán)格語義的(non-strict)盗尸,或者說是按需求值的(call-by-need)函數(shù)式語言的研究熱情柑船。
這方面的研究理所當(dāng)然的吸引了很多人,首先泼各,函數(shù)式語言簡單而優(yōu)雅鞍时,其次,惰性(lazy)與引用透明性有關(guān)扣蜻,并且還可以處理無窮長的數(shù)據(jù)結(jié)構(gòu)(infinite data structure)逆巍。
在80年代中期,很多研究者都想設(shè)計實現(xiàn)一個純函數(shù)式的(pure)惰性語言莽使,Miranda和Lazy ML是其中的兩個例子锐极。

1987年波特蘭FPCA'87會議之后,與會者想發(fā)明一種尚未命名的新語言芳肌,
其實一開始灵再,人們想從一門現(xiàn)有的語言開始肋层,逐漸發(fā)展迭代,比如說翎迁,使用當(dāng)時最成熟的Miranda栋猖。
Miranda是David Turner的公司Research Software Limited開發(fā)的一門語言,它是惰性求值的汪榔,包含代數(shù)數(shù)據(jù)類型蒲拉,使用了Hindley-Milner類型系統(tǒng),從1985年起用于商業(yè)中揍异。Miranda有很好用戶接口全陨,對實現(xiàn)的支持良好,還有大量的教材衷掷。

可是,與David Turner溝通后柿菩,他拒絕了這件事戚嗅。
我們想要一門用于研究語言特性的語言,因此我們決定任何人都可以擴(kuò)展和修改語言本身枢舶,重新實現(xiàn)或者發(fā)行懦胞。但是David Turner想維持一份語言規(guī)范,讓語言具有最好的可移植性凉泄,他不想讓Miranda出現(xiàn)各種不同的方言躏尉。

于是,Haskell的故事就這樣開始了后众。


參考

A History of Haskell
Non-strict semantics
Lazy Evaluation of Haskell
Foundations for Programming Languages

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胀糜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒂誉,更是在濱河造成了極大的恐慌教藻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件右锨,死亡現(xiàn)場離奇詭異括堤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绍移,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門悄窃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蹂窖,你說我怎么就攤上這事轧抗。” “怎么了恼策?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵鸦致,是天一觀的道長潮剪。 經(jīng)常有香客問我,道長分唾,這世上最難降的妖魔是什么抗碰? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绽乔,結(jié)果婚禮上弧蝇,老公的妹妹穿的比我還像新娘。我一直安慰自己折砸,他們只是感情好看疗,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著睦授,像睡著了一般两芳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上去枷,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天怖辆,我揣著相機(jī)與錄音,去河邊找鬼删顶。 笑死竖螃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逗余。 我是一名探鬼主播特咆,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼录粱!你這毒婦竟也來了腻格?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤关摇,失蹤者是張志新(化名)和其女友劉穎荒叶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输虱,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡些楣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宪睹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愁茁。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖亭病,靈堂內(nèi)的尸體忽然破棺而出鹅很,到底是詐尸還是另有隱情,我是刑警寧澤罪帖,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布促煮,位于F島的核電站邮屁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菠齿。R本人自食惡果不足惜佑吝,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绳匀。 院中可真熱鬧芋忿,春花似錦、人聲如沸疾棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽是尔。三九已至殉了,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拟枚,已是汗流浹背宣渗。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留梨州,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓田轧,卻偏偏與公主長得像暴匠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傻粘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容