radrow
radrow

Reputation: 7139

:sprint and `seq` together - missing evaluation?

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

Upvotes: 5

Views: 358

Answers (1)

radrow
radrow

Reputation: 7139

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

Upvotes: 1

Related Questions