我正在阅读 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
所以我的问题是: get 和 put 一般的目的是什么?
最佳答案
有点巧合的是random
恰好与 State
的内部函数具有完全相同的类型签名/使用模式monad (实际上在这种情况下,使用 getRandom2 = State random
可能会更简洁,如果可能更令人困惑的话)。
但是,更一般地说,这将不适用,然后是 get
和 put
是方便的管道部件,其含义可能比直接编写内部函数更清晰。它们还有助于从 State
使用的精确表示中进行抽象。 - 他们实际上是更一般的类(class)的类(class)成员MonadState
,因此您可以使用它们编写更多的多态代码。
关于state - MonadState get 和 put 的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574827/