Учитывая следующий код
rollDie :: GeneratorState Int
rollDie = do generator <- get
let (value, newGenerator) = randomR (1,6) generator
put newGenerator
return value
Я знаю, что могу перевести это как:
rollDie2 :: GeneratorState Int
rollDie2 = get >>= \generator ->let (value, newGenerator) = randomR(1,6) generator
in put newGenerator >> return value
Я протестировал обе функции с put newGenerator >>
и без него, и они дают разные результаты. Мой вопрос: почему? Функции put
являются чистыми, а оператор (>>
) означает, что на return value
не должны влиять предыдущие результаты.
rollDie
функцию можно переписатьrollDie = state (randomR (1,6))
- person cdk   schedule 11.07.2013GeneratorState
? Кроме того, как вы тестировали эти функции? - person mhwombat   schedule 11.07.2013GeneratorState
здесь: en.wikibooks.org/wiki/Haskell/Understanding_monads/ Состояние - person mhwombat   schedule 11.07.2013