On Sat, Aug 11, 2007 at 12:06:23AM -0400, David Menendez wrote:
> On 8/10/07, Andrew Coppin <[EMAIL PROTECTED]> wrote:
> >
> > My program needs to make decisions based on a pair of boolean values.
> > Encoding both values as a single algebraic data type means I have to
> > keep "taking it apart" so I can work with it. I'm not sure how much time
> > this wastes...
> 
> Incidentally, there is an argument that many (perhaps most) use of
> Bool should instead be custom datatypes. That is, instead of:
> 
>     type FooBar = (Bool, Bool)
> 
> one should instead do something like
> 
>     data Foo = Foo | AntiFoo
>     data Bar = Baz | Bo
>     type FooBar = (Foo, Bar)
> 
> which makes it clearer what's going on and harder to confuse the two booleans.
> 
> Of course, now you have to replace
> 
>     \(foo, bar) -> if foo then ... else ...
> with
>     \(foo, bar) -> if foo == Foo then ... else ...
> or
>     \(foo, bar) -> case foo of { Foo -> ...; Bar -> ... }
>
> Actually, that raises an interesting question. Is there a performance
> difference between "if foo == Foo ..." and "case Foo of ..."? I think
> JHC's case-hoisting should be able to transform the former into the
> latter, but does it?

You don't need to go all the way to JHC[1] for this; GHC's case-of-case
transformation is perfectly adequate, as GHC itself will tell you:

[EMAIL PROTECTED]:/tmp$ ghc -c -ddump-simpl -O2 X.hs
...
X.moo :: X.Ay -> GHC.Base.Int
...
X.moo =
  \ (x_a6D :: X.Ay) -> case x_a6D of wild_Xq { X.Be -> X.lit; X.Ce -> X.lvl }
[EMAIL PROTECTED]:/tmp$ cat X.hs
module X where

data Ay = Be | Ce deriving(Eq)

moo x = if x == Be then 2 else (3::Int)
[EMAIL PROTECTED]:/tmp$ ghc -c -ddump-simpl-stats -O2 X.hs
==================== FloatOut stats: ====================
1 Lets floated to top level; 0 Lets floated elsewhere; from 4 Lambda groups
==================== FloatOut stats: ====================
0 Lets floated to top level; 0 Lets floated elsewhere; from 3 Lambda groups
==================== Grand total simplifier statistics ====================
Total ticks:     46

9 PreInlineUnconditionally
11 PostInlineUnconditionally
6 UnfoldingDone
1 RuleFired
    1 ==#->case
9 BetaReduction
2 CaseOfCase            <-------
7 KnownBranch
1 CaseMerge
11 SimplifierDone
[EMAIL PROTECTED]:/tmp$

Stefan

[1] GHC takes 2 hours to run a full two-stage bootstrap complete with
    the entire standard library.  Jhc takes[2] at least 4 hours (I
    didn't let it finish) to compile just the Prelude.

[2] 700MB working set, 384MiB primary store.  This makes a difference.

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to