我正在阅读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
所以我的问题是:获取和放置的目的是什么?
答案 0 :(得分:12)
random
恰好具有与State
monad的内部函数完全相同的类型签名/使用模式,这有点巧合(事实上,在这种情况下,您可以更简洁,如果可能更令人困惑,可以使用getRandom2 = State random
)。
然而,更普遍的是不适用,然后get
和put
是方便的管道部件,其含义可能比直接编写内部函数更清晰。它们还有助于从State
使用的精确表示中抽象出来 - 它们实际上是更通用的类MonadState
的类成员,因此您可以使用它们编写更多的多态代码。