12

Real World Haskellのモナドの章(第14章)を読んでいます。関数は次のように定義されます。

type RandomState a = State StdGen a
getRandom :: Random a => RandomState a
getRandom =
    get >>= \gen ->
    let (val, gen')= random gen in
    put gen' >>
    return val

ここでget関数とput関数の目的がよくわかりません。同じことをしているようで、より簡潔な関数を次のように書き直しました。

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s

だから私の質問は:一般的にgetとputの目的は何ですか?

4

1 に答える 1

12

randomモナドの内部関数とまったく同じ型の署名/使用パターンを持っているのは少し偶然ですState(実際、この場合、おそらくもっと混乱しているとしたら、さらに簡潔になる可能性がありますgetRandom2 = State random)。

getただし、より一般的にはそれは当てはまらずput、内部関数を直接記述するよりも意味がおそらく明確な便利な配管部品です。また、によって使用される正確な表現から抽象化するのにも役立ちます。State実際には、より一般的なクラスのクラスメンバーであるMonadStateため、これらを使用してより多くのポリモーフィックコードを記述できます。

于 2010-04-04T16:16:34.237 に答える