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

Cis*_*one 12 monads state haskell

我正在阅读Real World Haskell中的Monads章节(第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
Run Code Online (Sandbox Code Playgroud)

我真的不明白get和put函数的用途.我重写了以下函数,它似乎做了同样的事情并且更简洁:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s
Run Code Online (Sandbox Code Playgroud)

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

GS *_*ica 12

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

然而,更普遍的是将不适用,然后getput方便水暖件,其意义或许比直接写入内部功能更加清晰.它们还有助于从所使用的精确表示中抽象出来State- 它们实际上是更通用类的类成员MonadState,因此您可以使用它们编写更多的多态代码.