>>33
I don't know
that much, having been at it for not-terribly-long. You might find this useful, from Control.Arrow, using (***) with the ((->) r) monad:
join (***) :: (Arrow a) => a b c -> a (b, b) (c, c)
For functions, specifically:
join (***) :: (b -> c) -> (b, b) -> (c, c)
It might do more harm than good introducing all these abstractions, but it's an option. I don't know what your problem is, but I'd generally use divMod if I needed both of them.