Попытка ознакомления с монадных трансформаторами, я написал следующий фрагмент кода:Haskell - не выход из в StateT монады
data GlobalState = GlobalState {
rng :: StdGen
}
foo :: IO()
foo =
evalStateT (StateT $
\s ->
let (v, newrng) = roll $ rng s in
return (putStrLn $ show v,
s { rng = newrng })
) zeroState >>
putStrLn "See you soon."
zeroState :: GlobalState
zeroState = GlobalState {
rng = mkStdGen 0
}
roll :: StdGen -> (Int, StdGen)
roll gen = randomR (1, 6) gen
Идея заключалась в том, чтобы инициализировать состояние, использовать его для действия IO и вернуться обратно до равного IO. Что-то, однако, идет не так, и печатается только «До свидания», putStrLn $ show v
не производит выход.
Итак, вопрос в том, как это исправить и, самое главное, Почему не печатает ничего?
Редактировать: спасибо всем за ваши ответы, они очень помогают.
Я думаю, что если вы назовете имя и присвоите его значение 'StateT', это может сделать проблему более ясной. 'return (putStrLn ...)' возвращает действие, которое * при оценке * будет печатать что-то, но затем вы выбрасываете его, когда используете '>>'. – ryachza
То есть 'evalStateT ... zeroState' имеет тип' Monad m => m (IO()) '; он должен иметь тип 'IO()'. – chepner