單子 (monad) 入門(二)讀取單子
一個算式的語意成了「拿一個環境,傳回一個整數」的函數。的確,既然算式算成的那個整數必須由環境決定,算式其實不能看作一個數子,而應該是從環境到整數的函數才對。
一個算式的語意成了「拿一個環境,傳回一個整數」的函數。的確,既然算式算成的那個整數必須由環境決定,算式其實不能看作一個數子,而應該是從環境到整數的函數才對。
Haskell 唯一的大錯誤,Simon Peyton Jones 說,是「單子」這冰冷生硬的數學名詞把人嚇跑了。我們應該把它取名為「暖毛毛(warm, fuzzy thing)」之類的。
函數 return 把一個型別為 a 的值「提升」到 m a;x >>= f 大致上的意思是執行 x 代表的運算,如果得到一個型別是 a 的值,把他傳給 f. 結果的型別是 m b.
函數語言程式有比較好的數學性質,我們可用來對程式做各種推論和操作。
三個函數都同樣地把串列從左至右走訪一遍,差別僅在碰到串列結尾時分別傳回不同的值,並用不同的運算元處理遞迴呼叫的結果。我們能不能讓這三個函數共用同一個定義呢?
由指令語言的觀點看函數語言,注意到的第一件事情是「函數語言裡面不可以改變數的值」。於是大家難免覺得奇怪,這怎麼會是個優點呢?自廢武功去掉一個功能,會有什麼好處呢?