Add more MonadZip instances
authorOleg Grenrus <oleg.grenrus@iki.fi>
Tue, 17 Mar 2015 16:03:44 +0000 (11:03 -0500)
committerAustin Seipp <austin@well-typed.com>
Tue, 17 Mar 2015 16:03:45 +0000 (11:03 -0500)
Summary: Add MonadZip Alt and MonadFix Alt instances

Reviewers: ekmett, dfeuer, hvr, austin

Reviewed By: austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D716

GHC Trac Issues: #10107

libraries/base/Control/Monad/Fix.hs
libraries/base/Control/Monad/Zip.hs

index ef8eeee..ae37911 100644 (file)
@@ -26,7 +26,8 @@ module Control.Monad.Fix (
 import Data.Either
 import Data.Function ( fix )
 import Data.Maybe
-import Data.Monoid ( Dual(..), Sum(..), Product(..), First(..), Last(..) )
+import Data.Monoid ( Dual(..), Sum(..), Product(..)
+                   , First(..), Last(..), Alt(..) )
 import GHC.Base ( Monad, error, (.) )
 import GHC.List ( head, tail )
 import GHC.ST
@@ -99,3 +100,6 @@ instance MonadFix First where
 
 instance MonadFix Last where
     mfix f   = Last (mfix (getLast . f))
+
+instance MonadFix f => MonadFix (Alt f) where
+    mfix f   = Alt (mfix (getAlt . f))
index df096b1..1f63cab 100644 (file)
@@ -17,7 +17,8 @@
 
 module Control.Monad.Zip where
 
-import Control.Monad (liftM)
+import Control.Monad (liftM, liftM2)
+import Data.Monoid
 
 -- | `MonadZip` type class. Minimal definition: `mzip` or `mzipWith`
 --
@@ -53,3 +54,24 @@ instance MonadZip [] where
     mzipWith = zipWith
     munzip   = unzip
 
+instance MonadZip Dual where
+    -- Cannot use coerce, it's unsafe
+    mzipWith = liftM2
+
+instance MonadZip Sum where
+    mzipWith = liftM2
+
+instance MonadZip Product where
+    mzipWith = liftM2
+
+instance MonadZip Maybe where
+    mzipWith = liftM2
+
+instance MonadZip First where
+    mzipWith = liftM2
+
+instance MonadZip Last where
+    mzipWith = liftM2
+
+instance MonadZip f => MonadZip (Alt f) where
+    mzipWith f (Alt ma) (Alt mb) = Alt (mzipWith f ma mb)