
As Dan said, this behaviour is correct.
The confusing thing here is that in case expressions guards are attached
to the patterns (i.e. to the lhs), while in let expressions they are
attached to the rhs.
So, despite the common "Just x | x > 0" part, your examples mean rather
different things.
Here's the translation of 'loops' according to the Report:
loops =
let Just x =
case () of
() | x > 0 -> Just 1
in x
Here it's obvious that 'x' is used in the rhs of its own definition.
Roman
* Andreas Abel
Hi, is this a known bug or feature of GHC (7.4.1, 7.6.3)?:
I got a looping behavior in one of my programs and could not explain why. When I rewrote an irrefutable let with guards to use a case instead, the loop disappeared. Cut-down:
works = case Just 1 of { Just x | x > 0 -> x }
loops = let Just x | x > 0 = Just 1 in x
works returns 1, loops loops. If x is unused on the rhs, the non-termination disappears.
works' = let Just x | x > 0 = Just 1 in 42
Is this intended by the Haskell semantics or is this a bug? I would have assumed that non-recursive let and single-branch case are interchangeable, but apparently, not...
Cheers, Andreas
-- Andreas Abel <>< Du bist der geliebte Mensch.
Theoretical Computer Science, University of Munich Oettingenstr. 67, D-80538 Munich, GERMANY
andreas.abel@ifi.lmu.de http://www2.tcs.ifi.lmu.de/~abel/
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe