[Haskell-beginners] Lazy state + IO not lazy?
Kim-Ee Yeoh
ky3 at atamo.com
Mon Oct 27 06:08:09 UTC 2014
Better to drill into the heart of the question and put aside state
transformers for now.
Consider
let u = return () :: IO () in
expr >> u
where expr ranges over (return undefined), (undefined), and (error "urk").
Are their executions surprising?
Compare to
let u = return () :: State Int () in
evalState (expr >> u) 0
for both strict and lazy state. IO above matches one of them. Suppose
IO's behavior matches the other, what happens?
Now with the definition of mapM in mind, consider the difference
between your original:
Lazy.evalStateT (head `fmap` mapM return (1:undefined)) 0
and
Lazy.evalStateT (head `fmap` mapM return [1,undefined]) 0
Did you mean the latter?
-- Kim-Ee
On 10/27/14, Jan Snajder <jan.snajder at fer.hr> wrote:
> Dear Haskellers,
>
> I'm confused with the behaviour of a lazy state monad when combined with
> an IO monad. Look at this:
>
> ghci> Control.Monad.State.Lazy.evalState (head `fmap` mapM return
> (1:undefined)) 0
> 1
>
> ghci> Control.Monad.State.Lazy.evalStateT (head `fmap` mapM return
> (1:undefined)) 0
> *** Exception: Prelude.undefined
>
> I would have expected the second case to behave identically to the first
> case. Why is this not the case?
>
> Cheers,
> Jan
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
--
-- Kim-Ee
More information about the Beginners
mailing list