MonadState获取和放置的原因是什么?

时间:2010-04-04 15:02:53

标签: state monads haskell

我正在阅读Real World Haskell中的Monads章节(第14章)。 函数是defined,如下所示:

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

所以我的问题是:获取和放置的目的是什么?

1 个答案:

答案 0 :(得分:12)

random恰好具有与State monad的内部函数完全相同的类型签名/使用模式,这有点巧合(事实上,在这种情况下,您可以更简洁,如果可能更令人困惑,可以使用getRandom2 = State random)。

然而,更普遍的是不适用,然后getput是方便的管道部件,其含义可能比直接编写内部函数更清晰。它们还有助于从State使用的精确表示中抽象出来 - 它们实际上是更通用的类MonadState的类成员,因此您可以使用它们编写更多的多态代码。