なんとなく理解するモナドとアプリカティブ
「通常」の値を受け取り、ある種の「拡張」された値を返す関数
「拡張」された値 = Result 型でラップされた値
したがって、モナディック関数 = スイッチ関数
https://scrapbox.io/files/66af628d724792001c02f4f6.png
技術的には、3 つの要素を持つ
データ構造
e.g. Result
関連するいくつかの関数
return(pure)
「通常」の値を「拡張」された値に変換する関数
Result の場合、Ok コンストラクタがこれに該当する
bind(flatMap)
モナディック関数を連鎖させるための関数
Result の場合
code:fsharp
let bind f aResult =
match aResult with
| Ok success -> f success
| Error failure -> Error failure
関数がどのように動作しなければならないかを定めるルール
code:haskell
return x >>= f = f x
mx >>= return = mx
(mx >>= f) >>= g = mx >>= (\x -> (f x >>= g))
code:haskell
do
x1 <- m1
x2 <- m2
.
.
.
xn <- mn
f x1 x2 ... xn
code:haskell
pure g <*> x1 <*> x2 <*> ... <*> xn
(<*>) :: Applicative f => f (a -> b) -> f a -> f b