The definition Just x | x > 0 = Just 1
is recursive. It conditionally defines Just x as Just 1 when x > 0 (and as bottom otherwise). So it must know the result before it can test the guard, but it cannot know the result until the guard is tested. Consider an augmented definition: Just x | x > 0 = Just 1 | x <= 0 = Just 0 What is x? On Tue, Jul 9, 2013 at 10:42 AM, Andreas Abel <andreas.a...@ifi.lmu.de>wrote: > 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.a...@ifi.lmu.de > http://www2.tcs.ifi.lmu.de/~**abel/ <http://www2.tcs.ifi.lmu.de/~abel/> > > ______________________________**_________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/**mailman/listinfo/haskell-cafe<http://www.haskell.org/mailman/listinfo/haskell-cafe> >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe