Johan
Consider this with -XStrict

f y = let Just x = blah[y] in body[y,x]
Suppose that in a call to f,

·         blah returns Nothing

·         but body does not use x
Should f succeed?  For sure, blah will be evaluated to HNF before body is 
started, but is the match against Just done strictly too?
According to our current semantics, in the match against Just is not done 
strictly, so the call should succeed.  I think that’s unexpected and probably 
wrong.
Here’s the semantics 
http://downloads.haskell.org/~ghc/master/users-guide/glasgow_exts.html#recursive-and-polymorphic-let-bindings
The translation for
            !(Just x) = blah

ð  (FORCE)   v = blah; Just x = v    (and add a seq on v)

ð  (SPLIT)     v = blah; x = case v of Just x -> x
So we finish up with

f y = let v = blah[y] in

      let x = case v of Just x -> x in

      v `seq` body[y,x]
I don’t think that’s what you intended.
If the pattern can fail, I think we want the FORCE step to say this:

Replace any binding !p = e with

v = case e of p -> (v1,..,vn); (v1,..,vn) = v

and replace e0 with v seq e0, where v is fresh and v1..vn are the variable(s) 
bound by p
(Compare with the text at the above link.)
Do you agree?
Simon


_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to