state - MonadState get 和 put 的原因?

标签 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

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

最佳答案

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

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

关于state - MonadState get 和 put 的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2574827/

相关文章:

c - 如何将字符串从 Haskell 传递给 C?

session - 在两个不同的应用程序之间传递 session 数据

reactjs - 如何将状态传递给 React Native 组件

haskell - 是否可以在单子(monad)序列中更改单子(monad)类型?

haskell - MonadBaseControl IO ... StateT 实现

javascript - 仿函数或单子(monad)的名称和存在以链接和终止操作序列

haskell - 有没有办法阻止 Data.Generics.Alloy.GenInstances 扫描 Data.Text.Internal?

haskell - 对方法的约束取决于范围内的实例?

haskell - 修改 monad 状态

javascript - 如何将服务注入(inject) AngularJS 的 UI-Router templateUrl 函数?