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

时间:2015-03-19 09:43:13

标签: haskell monads 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

put有定义

put newState = State $ \_ -> ((), newState)

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

1 个答案:

答案 0 :(得分:7)

删除put并获取一些随机值。我预测你总会得到相同的随机值&#34;。这就是haskell中随机生成器的工作原理:它(即randomR)是一个纯函数 - 给定相同的生成器,它将始终返回相同的结果。您必须将newGenerator提供给下一个呼叫。这是通过put完成的。