[Haskell-cafe] Why is there no Zippable class? Would this work?
johanj at cs.uu.nl
Fri Jul 17 01:35:15 EDT 2009
> Why is there no Zippable class? There is.
> You can use Data.Zippable from http://hackage.haskell.org/package/bff.
> It gives you a function
> tryZip :: Zippable k => k a -> k b -> Either String (k (a,b))
> The Either in the return type is to capture an error message in case
> two structures are not of the same shape.
This functionality can also be obtained from the generic programming
with the function
zip :: FRep3 ZipWith f => f a -> f b -> Maybe (f (a, b))
You can use Template Haskell to generate the necessary FRep3
instances. Once you have
those you get many other generic functions for free.
-- Johan Jeuring
> For example, for
> data Tree a = Leaf a | Node (Tree a) (Tree a)
> you would have:
> instance Zippable Tree where
> tryZip (Leaf a) (Leaf b) = Right (Leaf (a,b))
> tryZip (Node a1 a2) (Node b1 b2) = do z1 <- tryZip a1 b1
> z2 <- tryZip a2 b2
> return (Node z1 z2)
> tryZip _ _ = Left "Structure mismatch."
> Of course, you can get an "unsafe" zip by composing tryZip with a
> What's more, the mentioned package contains an automatic Template
> Haskell deriver for Zippable instances, so you don't have to write the
> above instance definition yourself.
> The implementation is by Joachim Breitner.
> Dr. Janis Voigtlaender
> mailto:voigt at tcs.inf.tu-dresden.de
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
More information about the Haskell-Cafe