[Haskell-cafe] GHC bug? Let with guards loops

Roman Cheplyaka roma at ro-che.info
Tue Jul 9 17:49:03 CEST 2013


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 <andreas.abel at ifi.lmu.de> [2013-07-09 16:42:00+0200]
> 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 at ifi.lmu.de
> http://www2.tcs.ifi.lmu.de/~abel/
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe



More information about the Haskell-Cafe mailing list