因此,就算在函數(shù)式語言上面我們?nèi)匀豢梢酝ㄟ^引入這種對象的形式對函數(shù)進(jìn)行相應(yīng)的模塊化和局部化,這種形式的對象與函數(shù)本身沒有任何差別。所以這種類型的對象系統(tǒng)被稱作“方便的接口”,用于簡化對象的函數(shù)的訪問和調(diào)用。
在函數(shù)式語言里,另一個非常重要的概念就是“副作用”(Side effect,即函數(shù)可以修改某個存在的狀態(tài))。像 Lisp 并不是純函數(shù)語言,是允許iPhone蘋果手機(jī)上倉庫管理的狀態(tài)修改。因此對象技術(shù)除了可以被看作函數(shù)局部化和模塊化的方法之外,還可以看作是副作用局部化的一種方式。采用這類面向?qū)ο蠹夹g(shù)的語言,通常被稱為動態(tài)面向?qū)ο笳Z言。
致遠(yuǎn)服軟認(rèn)為:http://www.soft8.com.cn/這類對象語言通常都會保持一些函數(shù)式語言的特性,比如 Lambda 的各種變體,比如較容易的函數(shù)組合,比如curry,比如高階函數(shù)。而且這類對象系統(tǒng)是從函數(shù)式發(fā)展出來的,因此也更加推崇一些副作用小的、利用高階函數(shù)的對象設(shè)計方法,比如不變體(Immutable object)回調(diào)等。
計算語義上,特種設(shè)備監(jiān)控管理平臺系統(tǒng)實際上和 Lambda 演算享有同樣的計算語義;而帶副作用的本身只能被看作一種壞的實現(xiàn),在函數(shù)上都沒有明確語義,僅僅能夠看作對于副作用的局部化和模塊化。
以上,我們簡單地看了一下兩種不同的iPhone蘋果手機(jī)上倉庫管理技術(shù),其中一種是用來解決如何構(gòu)造更好的類型系統(tǒng)的,另一種是用來對函數(shù)和副作用進(jìn)行有效模塊化和局部化的。如果單以這兩種面向?qū)ο蠹夹g(shù)和函數(shù)式語言去比較,實在不是一個層次的東西。那么為什么我們最近能夠聽到這么多關(guān)于函數(shù)和對象的討論呢?
最早的函數(shù)語言是不太在意類型的,因為有Data as Procedure的存在,Lambda 演算可以通過把參數(shù)類型抽象成另一個高階函數(shù)來繞過函數(shù)參數(shù)類型問題(把參數(shù)也變成Lambda,每個函數(shù)都看作參數(shù)和函數(shù)體的高階)。然而隨著形式化類型系統(tǒng)在理論上的發(fā)展,把 Lambda演算擴(kuò)展為typed lambda 演算就成了一種很自然的推論。
隨著在此基礎(chǔ)上發(fā)展出來的 ML 族和 Haskell 語言的日漸成熟以及代數(shù)數(shù)據(jù)類型(algebraic data type)的引入,這些iPhone蘋果手機(jī)上倉庫管理的開發(fā)技術(shù)可以較為容易地構(gòu)造出非常復(fù)雜的類型系統(tǒng)。而且伴隨著類型推演和類型計算的引入,類型間復(fù)雜的關(guān)系也可以較為容易地表達(dá)。由此,靜態(tài)類型函數(shù)式語言也開始挑戰(zhàn)以對象為基礎(chǔ)的類型系統(tǒng)構(gòu)造方法。