
21 Aug
2007
21 Aug
'07
3:24 p.m.
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