読者です 読者をやめる 読者になる 読者になる

セカイノカタチ

世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。最近はカメラの話題も多め

マーブルワーズ

「第2期 第25回 H本読書会 in 秋葉原」を終えて #readhbon #haskell

Haskell H本読書会 プログラミング 勉強会 技術書 読書 関数型

第2期第25回H本読書会を開催しました。

第14章「もうちょっとだけモナド」を読みました。

H本読書会とは?

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

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

こちらの本を輪読する読書会です。

Haskellを覚えると色々楽しいことがあるんじゃないかと始めた読書会で、Haskellに関する本を少しずつ読んでいくという工夫のないスタイルが売りです。(汗

第14章「もうちょっとだけモナド」途中から

P.329の「14.2 Reader? それはあなたです!」から読み進めました。

Readerモナドとは、「関数そのもの」のことなんですが、関数を代数的データ型として扱うという概念を理解するのが難しい。

(->)という関数の定義を型として捉え、モナドのインスタンスをMonad ((->) r)に対して定義します。((->)は型パラメータを2つ取る型で、中置法的に書くとr -> aです)

h >>= f = \w -> f (h w) w

これが、(>>=)の定義なのですが、モナドの定義から、hとfは下記のように分解できます。

h :: ((->) r) a
↓
h :: r -> a

f :: a -> ((->) r) b
↓
f :: a -> (r -> b)

(>>=) :: (r -> a) -> (a -> (r -> b)) -> (r -> b)

こうしてみると、(h w)は、hにr型を食わせるので、結果はa型となり、fにa型を渡すことになります、すると(r -> b)という関数が返るので、再びr型の変数を渡してb型の値を受け取るわけです。 そのため、「¥w -> f (h w) w」のシグネチャは、(r -> b)となります。これは、(>>=)の定義と一致します。

こんな感じで、状態系のモナドは、定義が複雑ですが、一つひとつ崩していけば、難しいことは無いと思います。

そして、一旦定義を理解してしまえば後は、使うだけです。

Readerモナドの場合は、hにもfにもwを渡していますので、最終的に受け取る引数をすべての計算に使い回すということがわかると思います。

次回、第26回 第14章「もうちょっとだけモナド」続き

次回は、11/25に開催です。恐らく14章を読み終わると思います。

モナドについて学びたい人、語りたい人、

これから始めたいと言う人も、是非ご参加ください。

readhbon.doorkeeper.jp