[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