instance MonadFix m => MonadFix (ListT m)
authorRoss Paterson <ross@soi.city.ac.uk>
Sun, 15 Oct 2017 22:45:06 +0000 (22:45 +0000)
committerRoss Paterson <ross@soi.city.ac.uk>
Sun, 15 Oct 2017 22:45:06 +0000 (22:45 +0000)
by M Farkas-Dyck
(but note that ListT is deprecated)

Control/Monad/Trans/List.hs

index e87fb0c..cebbee7 100644 (file)
@@ -40,6 +40,7 @@ import Control.Monad
 #if MIN_VERSION_base(4,9,0)
 import qualified Control.Monad.Fail as Fail
 #endif
+import Control.Monad.Fix
 #if MIN_VERSION_base(4,4,0)
 import Control.Monad.Zip (MonadZip(mzipWith))
 #endif
@@ -137,6 +138,12 @@ instance (Monad m) => MonadPlus (ListT m) where
         return (a ++ b)
     {-# INLINE mplus #-}
 
+instance (MonadFix m) => MonadFix (ListT m) where
+    mfix f = ListT $ mfix (runListT . f . head) >>= \ xs -> case xs of
+        [] -> pure []
+        x:_ -> (x:) <$> (runListT . mfix) ((mapListT . fmap) tail . f)
+    {-# INLINE mfix #-}
+
 instance MonadTrans ListT where
     lift m = ListT $ do
         a <- m