[project @ 2002-10-01 15:58:11 by erkok]
[ghc-base.git] / Control / Monad / Fix.hs
index 8327212..c465511 100644 (file)
@@ -2,7 +2,7 @@
 -- |
 -- Module      :  Control.Monad.Fix
 -- Copyright   :  (c) Andy Gill 2001,
---               (c) Oregon Graduate Institute of Science and Technology, 2001
+--               (c) Oregon Graduate Institute of Science and Technology, 2002
 -- License     :  BSD-style (see the file libraries/base/LICENSE)
 -- 
 -- Maintainer  :  libraries@haskell.org
@@ -16,6 +16,9 @@
 --           Higher-Order Polymorphism/, 
 --         Mark P Jones (<http://www.cse.ogi.edu/~mpj>)
 --               Advanced School of Functional Programming, 1995.
+--
+-- Oct. 1st, 2002: Added instances for Lazy ST, ST, and List monads
+--           
 -----------------------------------------------------------------------------
 
 module Control.Monad.Fix (
@@ -26,6 +29,8 @@ module Control.Monad.Fix (
   ) where
 
 import Prelude
+import qualified Control.Monad.ST.Lazy as LazyST
+import qualified Control.Monad.ST as ST
 import System.IO
 
 fix :: (a -> a) -> a
@@ -34,13 +39,27 @@ fix f = let x = f x in x
 class (Monad m) => MonadFix m where
        mfix :: (a -> m a) -> m a
 
+-- Instances of MonadFix
+
+-- Maybe:
 instance MonadFix Maybe where
-       mfix f = let
-               a = f $ case a of
-                       Just x -> x
-                       _      -> error "empty mfix argument"
-               in a
+    mfix f = let a = f (unJust a) in a
+             where unJust (Just x) = x
+
+-- List:
+instance MonadFix [] where
+    mfix f = case fix (f . head) of
+               []    -> []
+               (x:_) -> x : mfix (tail . f)
 
+-- IO:
 instance MonadFix IO where
-       mfix = fixIO
+    mfix = fixIO 
 
+-- Lazy State:
+instance MonadFix (LazyST.ST s) where
+    mfix = LazyST.fixST
+    
+-- Strict State:
+instance MonadFix (ST.ST s) where
+    mfix = ST.fixST