從函式式的角度反思
我們都知道第一臺電腦是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。(等等,回家後接著寫)
接著說,為什麼加法器,分析機等,不叫做電腦?最重要的差別,儲存。之所以叫“腦”也因為具有記憶能力。然而我不是來解釋什麼是電腦的,我提出的目的是讓你看到,即使在第一臺計算機誕生之前,仍然能夠進行邏輯運算。人腦的記憶能力和邏輯能力是分開的,你即使記得 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修改過]
相關文章
- webgl內建函式--角度和三角函式Web函式
- 嵌入式反思
- 從極大似然估計的角度理解深度學習中loss函式深度學習函式
- 從函式式元件引發的效能思考函式元件
- 從閉包函式的變數自增的角度 – 解析js垃圾回收機制函式變數JS
- 從閉包函式的變數自增的角度-解析js垃圾回收機制函式變數JS
- 從閉包函式的變數自增的角度 - 解析js垃圾回收機制函式變數JS
- 從settTimeout到匿名函式、箭頭函式之() => {}函式
- main函式的入口函式AI函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- EventEmitter:從命令式 JavaScript class 到宣告函式式的華麗轉身MITJavaScript函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- 換個角度看GAN:另一種損失函式函式
- 箭頭函式、簡寫函式、普通函式的區別函式
- (譯) 函式式 JS #2: 函式!函式JS
- Sql 中的 left 函式、right 函式SQL函式
- 閉包函式(匿名函式)的理解函式
- Rust中的into函式和from函式Rust函式
- 函式: 函式是怎麼使用的?函式
- 【譯】函式式的React函式React
- python內建函式-eval()函式與exec()函式的區別Python函式
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 核函式 多項式核函式 高斯核函式(常用)函式
- 從 ES6 高階箭頭函式理解函式柯里化函式
- 【C++筆記】虛擬函式(從虛擬函式表來解析)C++筆記函式
- 【C++筆記】虛擬函式(從虛擬函式概念來解析)C++筆記函式
- 如何使用函式指標呼叫類中的函式和普通函式函式指標
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- JavaScript中的compose函式和pipe函式JavaScript函式
- 函式外與函式內的變數函式變數
- ton函式函式hash的兩種形式函式
- strcpy函式和memcpy函式的區別函式memcpy
- 類的建構函式和解構函式函式
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- 從高階函式--->高階元件函式元件
- 從函式計算到 Serverless 架構函式Server架構
- Python函式與lambda 表示式(匿名函式)Python函式