我学习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
。如果删除这一行(或者我错过了什么?)没有区别,那么,这条线的真正含义是什么?
答案 0 :(得分:7)
删除put
并获取一些随机值。我预测你总会得到相同的随机值&#34;。这就是haskell中随机生成器的工作原理:它(即randomR
)是一个纯函数 - 给定相同的生成器,它将始终返回相同的结果。您必须将newGenerator提供给下一个呼叫。这是通过put
完成的。