[Haskell-cafe] and from standard Prelude

Jan-Willem Maessen jmaessen at alum.mit.edu
Tue Aug 24 13:55:39 EDT 2010


On Wed, Aug 18, 2010 at 9:56 PM, wren ng thornton <wren at freegeek.org> wrote:
> Oleg Lobachev wrote:
>>>
>>> #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
>>>
> The thing I find puzzling is that the foldr is inlined. The (regular) clever
> optimizations for build/foldr seem like they should already handle this
> without the need for the extra rules. I wonder how much is gained by
> specializing to (&&)/True instead of relying on the regular deforestation?

The above code does not inline and / or, *unless they are fused using
the RULES.*  There's not really any benefit to inlining them
otherwise, and it duplicates code.

-Jan-Willem Maessen

>
> --
> Live well,
> ~wren
> _______________________________________________
> 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