Reader
関数の型 (->) r
はファンクターであり、アプリカティブファンクターであるばかりでなく、モナドでもある。
関数にとっての文脈とは、値がまだ手元になく、値がほしければその関数を別の何かに適用しないといけない。
というもの。
instance Monad ((->) r) where return x = \_ -> x h >>= f = \w -> f (h w) w
return
は最小限の文脈。値を取って値を返す。引数を無視すると必ず同じ値を返す。
>>=
は、モナド値を入力してモナド値を返すので、ある関数を別の関数に入力した結果として関数を返す。
この場合、f に h を適用している。
Readerモナド
関数モナドを使っている do 式
import Control.Monad.Instances addStuff :: Int -> Int addStuff = do a <- (*2) b <- (+10) return (a+b)
実行
*Main> addStuff 3 19
do式は常にモナド値を生み出すもの。この場合、do式は関数モナドを返す。
(*2)
と(+10)
はどちらも3に適用される。return (a+b)
も3に適用されるが、
引数を無視して常にa+b
を返している。
関数モナドはReaderモナドと呼ばれている。全ての関数が共通の情報を読むから。
最後の引数が届くのを待っている関数がたくさんあって、 しかもそれらに渡したい値は全部同じという状況であればReaderモナドを使って未来の結果を取り出すことができる。
所感
理解が苦しくなってきた。モナドをはじめから復習する必要がある。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る