卡在 Haskell Wiki 中的 State Monad 示例中
Stucked in the example of State Monad in Haskell Wiki
我正在学习 State Monad,无法理解 Wiki 中的一个示例 (http://en.wikibooks.org/wiki/Haskell/Understanding_monads/State)
rollDie :: GeneratorState Int
rollDie = do generator <- get
let (value, newGenerator) = randomR (1,6) generator
put newGenerator
return value
put
有定义
put newState = State $ \_ -> ((), newState)
好像put
只是新建了一个State
,这一行的实际用途是什么?如果要使用值可能应该使用<-
来提取,如果想再次使用state
应该使用get
。如果删除这一行(或者我遗漏了什么?)没有区别,那么,这一行到底是什么意思?
删除 put
并获得一些随机值。我预测你将永远得到相同的 "random value"。这就是 haskell 中随机生成器的工作原理:它(即 randomR
)是一个纯函数 - 给定相同的生成器,它总是 return 相同的结果。您必须将 newGenerator 提供给下一个调用。这是通过 put
.
完成的
我正在学习 State Monad,无法理解 Wiki 中的一个示例 (http://en.wikibooks.org/wiki/Haskell/Understanding_monads/State)
rollDie :: GeneratorState Int
rollDie = do generator <- get
let (value, newGenerator) = randomR (1,6) generator
put newGenerator
return value
put
有定义
put newState = State $ \_ -> ((), newState)
好像put
只是新建了一个State
,这一行的实际用途是什么?如果要使用值可能应该使用<-
来提取,如果想再次使用state
应该使用get
。如果删除这一行(或者我遗漏了什么?)没有区别,那么,这一行到底是什么意思?
删除 put
并获得一些随机值。我预测你将永远得到相同的 "random value"。这就是 haskell 中随机生成器的工作原理:它(即 randomR
)是一个纯函数 - 给定相同的生成器,它总是 return 相同的结果。您必须将 newGenerator 提供给下一个调用。这是通过 put
.