wvogel日記

自分用の技術備忘録が多めです.

Monoid

今も弄ってたのですが、gitHubの使い方が段々分かってきました。
どのPCからでもアクセスできるのが便利ですね。
まあ面倒なのでFedoraからしかcommitはしないですが。


で、前回(?)記事にした、ノベルゲームを作るための前段階としてセーブ関数ロード関数を作成したわけですが。
他に足りないものと言えば、シナリオを読み込む、スクリプトパーサ部が足りません。
そして、そのデバッグのためにも、もし読み込みエラーが発生したときそのエラーがどこで起こったのか知る必要があります。
つまり、logをとる動作。


これは明らかに副作用なのでモナドを利用するのですが、
以前に、ログの記録ななどにWriterモナドは有効である、という内容のことを読んだ気がします。
もしそうであるなら、スクリプトパーサを実行し、そのエラーが発生したときに何行目、あるいは何文字目で例外が発生したのかを簡単にログとして記録できるのでは?


IOモナドリストモナドの利用だけで十分実現できるので別にわざわざ使う必要はないと思うのですが、とりあえず調べてみた


すると、モノイドという言葉がちらほら。
何でしょう?


モノイドとは、次の二つの条件を満たす

①a * ( b * c) == ( a * b ) * c
②a * e == a && e * a == a

上の例で演算子は(*)となっていますが、どのような演算でも構わないそうです。
例えば、(++)や和差演算は①を満たします
②でのeは単位元と呼ばれ、上の式を満たすものとしては、
文字列では[]、和差演算では0です。

MaybeモナドのMonadPlusでは、単位元はNothing、(*)演算子はmplusに相当する、ということであっているでしょうか。


モノイドがどういうものかわかったところで、Writerモナド.....
といきたいですが、もう寝ないと明日の授業間に合いそうにないので寝ます。
おやすみなさい
(b, w') = runWriter (k a)
in (b, w `mappend` w')
|