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

參考資料

非純粹的界線:IO Monad

https://www.haskell.org/onlinereport/haskell2010/haskellch7.html

https://www.haskell.org/tutorial/io.html