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

Reply via email to