add Foldable and Traversable instances for Either a and (,) a
authorRoss Paterson <ross@soi.city.ac.uk>
Fri, 31 May 2013 01:25:57 +0000 (02:25 +0100)
committerRoss Paterson <ross@soi.city.ac.uk>
Fri, 31 May 2013 01:25:57 +0000 (02:25 +0100)
Agreed in January 2011, but not implemented:

http://thread.gmane.org/gmane.comp.lang.haskell.libraries/15196
http://thread.gmane.org/gmane.comp.lang.haskell.libraries/17686
http://thread.gmane.org/gmane.comp.lang.haskell.libraries/19594

Data/Foldable.hs
Data/Traversable.hs

index 86c8f10..7f77a4a 100644 (file)
@@ -175,6 +175,18 @@ instance Foldable [] where
     foldr1 = Prelude.foldr1
     foldl1 = Prelude.foldl1
 
+instance Foldable (Either a) where
+    foldMap _ (Left _) = mempty
+    foldMap f (Right y) = f y
+
+    foldr _ z (Left _) = z
+    foldr f z (Right y) = f y z
+
+instance Foldable ((,) a) where
+    foldMap f (_, y) = f y
+
+    foldr f z (_, y) = f y z
+
 instance Ix i => Foldable (Array i) where
     foldr f z = Prelude.foldr f z . elems
     foldl f z = Prelude.foldl f z . elems
index f5ac060..be5fe24 100644 (file)
@@ -182,6 +182,13 @@ instance Traversable [] where
 
     mapM = Prelude.mapM
 
+instance Traversable (Either a) where
+    traverse _ (Left x) = pure (Left x)
+    traverse f (Right y) = Right <$> f y
+
+instance Traversable ((,) a) where
+    traverse f (x, y) = (,) x <$> f y
+
 instance Ix i => Traversable (Array i) where
     traverse f arr = listArray (bounds arr) `fmap` traverse f (elems arr)