北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Stateモナドの意味を想像する

Stateモナドのお勉強。なんとなくモナドの正体が見えたような。ただし、半分予測を含む理解なので正当性は保証しないです。後、実際の使用方法は全然気にしてなくて、意味だけ考えてます。*1

Stateモナドを理解するために頭の中に用意するのはa、bの集合(型)と、それに対応するState a、State bの集合。それと実際の状態を表すsの集合。State aの要素とaの要素には1-1の写像を持っている*2ので、State aはaと同じ物として扱ってよい*3。では、何が違うかと言えば、State aの要素はsの集合を変化させる写像を持っている。これが状態を変化させる肝となる。

ここまで理解できれば、これにa -> State bの写像fをバインドさせる定義は、自ずと出てくる。これはState aの要素をState bの要素に対応させる写像となるが、State a(b)がa(b)の要素への1-1対応とsの要素を変化させる性質を持っていることを思い出してみれば、

  • f(a) によって得られるState bの要素の集合b側の値*4
  • sに関しては、State aとState bのそれぞれの要素による状態変化の合成*5

の両方の側面を持つ要素となる。バインド後の要素mbは、bと言う値と状態をs1(○)->s2(△)->s3(□)と変化させる写像を抱えている。



・・・と思う(笑) 。

参考はこちら


【懺悔的追記】

Monad.Stateのgetやらput見る限り、この解釈は違う気がしてきました(笑)。またリベンジします。。。

【4/16 追記】
あまり酷い内容を放置だとまずいと思ったので、駄目っぽいとこを消しましたw

*1:プログラマとしては普通逆を考えるべきですねw

*2:aに対応するState aの要素はある(return a)が、逆はそうとは限らないはず

*3:集合aの拡張と思った方がいい

*4:s aの要素に対応する要素がaにあるとは限らないので、これはよくない

*5:モナドから値を取り出してfを適応して、最初にモナドから取り出した状態を適応する必要あり