被困在Haskell Wiki的State Monad的例子中

hli*_*liu 2 monads haskell state-monad

我正在学习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
Run Code Online (Sandbox Code Playgroud)

put有定义

put newState = State $ \_ -> ((), newState)
Run Code Online (Sandbox Code Playgroud)

它似乎put只是创造了一个新的State,这条线的实际用途是什么?如果要使用该值可能应该使用<-提取,而如果state要再使用则应该使用get.如果删除这一行(或者我错过了什么?)没有区别,那么,这条线的真正含义是什么?

Fra*_*nky 7

删除它put并获取一些随机值.我预测你将永远得到相同的"随机值".这就是haskell中随机生成器的工作方式:它(即randomR)是一个纯函数 - 给定相同的生成器,它将始终返回相同的结果.您必须将newGenerator提供给下一个呼叫.这是通过put.

  • 这就是一个好的`State`实现提供`state ::(s - >(a,s)) - > State sb`的原因.然后`rollDie = state(randomR(1,6))`. (3认同)