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 the
two structures are not of the same shape.

This functionality can also be obtained from the generic programming library EMGM,
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.

See

http://hackage.haskell.org/package/emgm

-- 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 fromRight.

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.

Ciao,
Janis.

--
Dr. Janis Voigtlaender
http://wwwtcs.inf.tu-dresden.de/~voigt/
mailto:vo...@tcs.inf.tu-dresden.de

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

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

Reply via email to