Hi Peter, > liftV1 f (V x y) = V (f x) (f y) > liftV2 f (V x1 y1) (V x2 y2) = V (f x1 x2) (f y1 y2) > > liftM1 f (M x y) = M (f x) (f y) > liftM2 f (M x1 y1) (M x2 y2) = M (f x1 x2) (f y1 y2)
> Both pairs of lift functions have almost identical implementations. Can I > merge these somehow? Using the Uniplate library the first already has a name, its called "descend". The second does not, but could be implemented in Uniplate if you wanted. descend2 :: Biplate a b => (b -> b -> b) -> a -> a -> a descend2 f a b = a2 (zipWith f as bs) where (as, a2) = uniplate a (bs, b2) = uniplate b For full details see the website: http://www-users.cs.york.ac.uk/~ndm/uniplate/ Thanks Neil _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe