
Hello Everyone, In the HPFFP book, there's a homework problem where you're supposed to refactor a recursive function that rolls dice to return the number of rolls it takes to reach or exceed an input sum and the list of die that occurred. As practice, decided to take the solution and implement it using the State monad: -- Refactor rollsCountLoggged to use State -- limit sum count StdGen [Die] type RollsState = (Int, Int, Int, StdGen, [Die]) -- count [Die] type RollsValue = (Int, [Die]) runRolls :: State RollsState RollsValue runRolls = do (l, s, c, sg, xs) <- get if (s >= l) then return (c, reverse xs) else do let (d, ng) = randomR (1, 6) sg put (l, s + d, c + 1, ng, intToDie d : xs) runRolls rollsCountState :: Int -> IO () rollsCountState n = print $ evalState (runRolls) (n, 0, 0, mkStdGen 0, []) I'm wondering if that 'do' block under the else is a not so great stylistic choice. If the 'let' and 'put' is moved above the 'if', then that's just an unnecessary call at the end. Or is it just the nature of running inside a monad? Thank You, Andrea Sent with [ProtonMail](https://protonmail.com) Secure Email.