從函式式的角度反思

SpeedVan發表於2013-07-26
我們都知道第一臺電腦是ENIAC,但更前是什麼?加法器,差分機,分析機等。還記得打孔卡嗎?沒錯,最古腦的程式設計。為什麼我提到這些?因為他們的變化,正是我們思維的應有的變化,但縱觀各大技術論壇,哪怕是學校,公司,大部分都忽視了這個變化。


接著說,為什麼加法器,分析機等,不叫做電腦?最重要的差別,儲存。之所以叫“腦”也因為具有記憶能力。然而我不是來解釋什麼是電腦的,我提出的目的是讓你看到,即使在第一臺計算機誕生之前,仍然能夠進行邏輯運算。人腦的記憶能力和邏輯能力是分開的,你即使記得 1 2 3 等數字,+-*/等符號,但這些記憶不是邏輯——你只是記住了,這並沒有證明你瞭解他們的關係。計算機其實也是這樣,運算器和儲存器是很自然地分開的兩個概念。


我們都是程式設計的,自然地我們經常接觸儲存技術,持久層等概念。嗯,我們認為掌握這些就能滿足計算機的要求了。但事實是,這是非常表面,或者說這些根本沒有解決問題。最近看過我帖子的人都應該知道,我程式設計思維已經發生很大改變。沒錯,我已經縱身投入到函式程式設計領域,特別是Haskell。我們都知道跟計算機是建立在大量的數學理論上,所以跟計算機交流最好就是數學。我們最常最廣泛使用的指令式程式設計,卻離數學非常遠。


函式世界裡的計算機


指令式與函式式對比,這是個久遠的話題,好像函式式一直處於下風。我們經常說指令式對自然語言友好,函式苦澀難懂。但我並不談那個,而是談談這個:在指令式和函式式的世界觀中,他們認為計算機是什麼?這是很少人會去思考的問題。在指令式的世界觀中,很簡單,計算機就是指令的集合,而函式式呢?非常特別,它認為計算機是一個IO函式(特別拿出Haskell,因為他是純的)。我第一次接觸Haskell的時候,看見main函式是IO函式時,也是一愣,然後腦中莫名衝動起來,因為函式式一直以來都是因為IO問題而遭人“歧視”。在這麼純的函式語言中,IO是如何處理呢?因為只有處理好了IO才能登上計算機的舞臺。


我以前有提過這麼一個觀點:儲存了的資料,若果“永遠”不會被使用來輸出,那就等於沒有儲存資料。也就是說我們之所以儲存資料,是因為我們以後“一定”會輸出它(不一定是直接輸出)。函式式在這裡也有相似的理解,用抽象的表示式表達就是IOin ==> function ==> IOout,也就是說計算機實際上就是IO,整臺計算機的邏輯就是中間的function。多麼美妙,輸入與輸出是一起的,函式是他們的橋樑,這與指令式的思維非常不同。在Haskell裡我接觸到了monad,這真是神奇的東西,因為是它實現了函式里的IO,函式里的IO不像指令中的,不是想在什麼位置輸出就在什麼位置輸出,它是集中輸出的,你可以理解IO是一個值型別,這類值具有這樣的特性IO+IO=IO,就像[]++[] =[]一樣。它把輸出理解成可運算的(組合),類似這樣的效果:print "abc\n" + print "def" = print "abc\ndef" ,最後把合成的東西交給IO,就會輸出你想要的結果。從現實世界走入計算機,經過計算機思考,再從計算機走出現實世界,這就是函式式思維。


上面就像我在介紹函式式一樣,這是必須的,因為我們進行反思前,首先要了解函式的思維。接下來,首當其衝第一個要反思的是資料庫,DB。(等等,回家後接著寫)

[該貼被SpeedVan於2013-07-26 18:36修改過]

[該貼被SpeedVan於2013-07-26 19:15修改過]

相關文章