I understand a `seq` b as "be strict on a and compute b", so undefined `seq` True throws and Exception.
I am playing around with :sprint and tried following test in ghci:
Prelude> x = [True, undefined]
Prelude> :sprint x
x = _
Okay, because x was not computed yet
Prelude> x `seq` True
True
Prelude> :sprint x
x = _
Why x = _ at this moment? I thought that seq will evaluate x at least to _:_ (or more possibly True:_), but its value still remains completely latent. It needs somehow check whether x is not undefined, so it needs to perform kind of evaluation, but why doesn't it keep the result?
I am using GHC 8.6.3
Okay, I made a ticket on trac (link: https://ghc.haskell.org/trac/ghc/ticket/16089) and it seems to be a bug related to another one (https://ghc.haskell.org/trac/ghc/ticket/16096).
Problem was a result of how x = y and let x = y were treated in GHCi – the first one was interpreted as toplevel binding (with monomorphism restriction turned off by default) and the second one as let statement in do block. This issue implied some other unwanted behaviors like for example lack of shadowing warnings when -Wall was turned on. You may inspect fix for this at this thread: https://phabricator.haskell.org/D5473
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With