[Haskell-cafe] How Albus Dumbledore would sell Haskell

Mirko Rahn rahn at ira.uka.de
Thu Apr 19 06:59:08 EDT 2007


>        * small
>        * useful
>        * demonstrate Haskell's power
>        * preferably something that might be a bit
>                tricky in another language

Something I like: A finite (binary) relation

 > data Rel q = Rel { elems :: [(q,q)] }

We do not export constructors, hence

 > rel xs = Rel { elems = xs }

Now, the function mirror

 > mirror r = rel [ (p,q) | (q,p) <- elems r ]

is an involution, that is mirror . mirror == id. Okay, how to exploit 
that? Nothing easier than that in Haskell: Just make mirror a field of Rel

 > data Rel q = Rel { elems :: [(q,q)], mirror :: Rel q }

and change the construction function to

 > rel xs = r
 >     where r = Rel
 >             { elems = xs
 >             , mirror = let m = rel [ (p,q) | (q,p) <- elems r ]
 >                        in m { mirror = r }
 >             }

Note that the signatures of mirror and rel are the same as before. Try 
this in your favorite language!

Regards,

-- 
-- Mirko Rahn -- Tel +49-721 608 7504 --
--- http://liinwww.ira.uka.de/~rahn/ ---


More information about the Haskell-Cafe mailing list