IO Monad 筆記
Page content
前言
IO Monad Haskell
命令式語言 vs. 函數式語言
命令式語言 (procedural programming)
程式由 procedure 組合而成,每個 procedure 可能又各自由其他 procedure 組合而成
明確地告訴電腦,你在這個時間,做這件事情
proc() {
proc1()
proc2()
...
}
函數式語言
由一些 “純” 函數組合而成
f1( f2( f3(...) ) )
“純” 意思是沒有副作用 (side-effect)
常見的副作用包括
- 改變變數的值 (state,狀態)
- 印東西到螢幕上
- 取得鍵盤輸入值
純函數式的寫法有許多好處,但
在 Haskell 中,IO Monad就是 純 和 不純 之間的界線
如何在純函數語言中處理 side effect
把真實世界當作參數,而這個函數回傳一個新的世界
data World = World
f :: World -> World
把 World 藏起來
curry / uncurry
這裡影片先跳出去說了一下 curry 和 uncurry 的概念。
在 JavaScript 可以用這樣來達成
function f(a, b) {
return a + b;
}
f(10, 20); // 30
function g(a) {
return function(b) {
return a + b;
}
}
g(10)(20); // 30
而 uncurry 是跟 curry 相反的概念
來看一下 Haskell 的定義
Prelude> :i uncurry
uncurry :: (a -> b -> c) -> (a, b) -> c -- Defined in ‘Data.Tuple’
Haskell 中的 IO Monad
參考資料
https://www.haskell.org/onlinereport/haskell2010/haskellch7.html