12

我正在阅读 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

我不太了解这里的 get 和 put 函数的目的。我重写了以下函数,它似乎做同样的事情并且更简洁:

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

所以我的问题是:get 和 put 一般的目的是什么?

4

1 回答 1

12

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

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

于 2010-04-04T16:16:34.237 回答