Hello all, the and function, and :: [Bool] -> Bool is defined in two different ways in the latest Prelude.
I would expect it to be > and = foldr (&&) True However, there is a further recursive definition, and it is the one used! See http://haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/GHC-List.html#and > #ifdef USE_REPORT_PRELUDE > and = foldr (&&) True > or = foldr (||) False > #else > and [] = True > and (x:xs) = x && and xs > or [] = False > or (x:xs) = x || or xs > > {-# RULES > > "and/build" forall (g::forall b.(Bool->b->b)->b->b) . > > and (build g) = g (&&) True > > "or/build" forall (g::forall b.(Bool->b->b)->b->b) . > > or (build g) = g (||) False > > #-} > #endif Is there any reason for that besides some clever optimizations? I am particularly interested in the behavior of and for infinite lists and these two versions are equivalent in this aspect. Greetings, Oleg _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe