学習の素材は、
関数プログラミング実践入門
この表記は、私見・感想です。
個別のモナドについても整理しています。
モナドの用語整理
モナドという聞きなれない言葉からは素直なイメージが湧かないが、ここでは 計算する上で生まれる特定の文脈を効率的に扱うための仕掛け という理解をしておくことにする。
モナド型クラス
モナドは型クラスであり、次のように定義されている。
class Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
モナドは型クラス、ということは、モナドという性質を実装したインスタンスが存在する、ということ。それがリストだったりMaybeだったりする。
ここでまず、mとかaとかについて言い換えて整理しておきたい。
記号 | 説明 | サンプル |
---|---|---|
m |
Monad クラスのインスタンス。何らかの文脈を持つことになる、多相型データ構造。 |
[] , Maybe
|
a |
任意の型を表す型変数。 |
Int , String
|
m a |
m a 型のデータ構造。この型を返す関数を、特に モナドmのアクション と呼ぶ。 |
[Int] , Maybe Double
|
(>>=) |
bind と呼ばれる演算子で、アクション同士の組み合わせ方。 |
["3"] >>= \x -> [7 + read x] |
return |
ただのa 型の値にモナドmという文脈を持たせるための関数。命令型言語のreturn とは全然違う |
return "hoge" |
(>>=)の例
--リストモナドのアクションを結合する
*Control.Monad> ["3"] >>= \x -> [7 + read x]
[10]
モナド則
モナド則 (monad laws) と呼ばれる性質を満たすようにインスタンスを作る。これらの規則を満たしていないインスタンスを作っても、それはモナドではないし、直感と反した動作をすることになる。例えば、規則2が満たされていないとして、[1] >> return
が [123]
となってしまったらとても気持ち悪い。
return x >>= f = f x -- 規則1
m >>= return = m -- 規則2
( m >>= f ) >>= g = m >>= ( \x -> f x >>= g ) -- 規則3
それぞれを do記法で表記すると、次のようになる。
規則1
do
y <- return x
f y
-- == f x
規則2
do
x <- m
return x
-- == m
規則3
--左辺
do
x <- m
do
y <- f x
g y
--右辺
do y <- do x <- m
fx
g y
do記法
文脈を伴う計算を、手続き/命令的に記述するための構文糖衣
参考情報
記事内容が大変に分かりやすかったです。