
On 01/21/11 18:33, Edward Kmett wrote:
I'd like to propose adding the following missing instances to Data.Foldable and Data.Traversable respectively, since there isn't a canonical location that they could be added outside of those packages without orphans, their definition is unambiguous, and they are quite useful (plus, I happen to need them for a monad transformer in my adjunctions package).
instance Foldable (Either a) where foldMap f (Left a) = mempty foldMap f (Right b) = f b
instance Foldable ((,)e) where foldMap f ea = f (snd ea)
instance Traversable (Either a) where traverse f (Left a) = pure (Left a) traverse f (Right a) = Right<$> f a
instance Traversable ((,)e) where traverse f ~(e,a) = (,) e<$> f a
Those look correct. Is there some reason you chose to make the (,) instances less strict in the pair? For example, traverse on "undefined" gives you, modulo the applicative layer, "(undefined, f undefined)". (I haven't thought of a reason (practical or theoretical) for either behavior.) -Isaac