【问题标题】:The reason for MonadState get and put?MonadState get 和 put 的原因?
【发布时间】:2011-02-04 05:07:06
【问题描述】:

我正在阅读 Real World Haskell(第 14 章)中的 Monads 章节。 一个函数是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 一般的目的是什么?

【问题讨论】:

  • 只是在这种情况下,还是get和put的一般用途?在后一种情况下,它们的使用更容易解释……
  • 一般;我将编辑我的问题。

标签: state monads haskell


【解决方案1】:

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

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

【讨论】:

  • 我还有一个问题——put 如何为下一次调用保持新状态? put 的输出被忽略了,我想不通。请帮帮我。谢谢。
  • 这是State monad 内部管道的一部分。 put 的一元输出是 () 类型,表明它不是有用的值。
  • 感谢您的回复。但我不完全明白。这是否意味着 put 有一些副作用?你能解释一下它是如何存储新状态的吗?谢谢。
  • 也许你应该问一个新问题,这在 cmets 中讨论似乎有点长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 2018-10-25
  • 2011-03-08
  • 2017-09-12
  • 2020-08-15
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多