fugafuga.write

日々のログ

すごいH本 part93

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モナドを使って未来の結果を取り出すことができる。

所感

理解が苦しくなってきた。モナドをはじめから復習する必要がある。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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