-- |
-- 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
-- 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 (
) 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
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
+++ /dev/null
------------------------------------------------------------------------------
--- |
--- Module : Control.Monad.MonadRec
--- Copyright : (c) Oregon Graduate Institute of Science and Technology, 2002
--- License : BSD-style (see the file libraries/base/LICENSE)
---
--- Maintainer : libraries@haskell.org, erkok@cse.ogi.edu
--- Stability : experimental
--- Portability : portable
---
--- Declaration of the MonadRec class, and instances for
--- maybe, list, IO, strict state, and lazy state monads
---
--- Note : There's a clear overlap with the Control.Monad.Fix
--- module, as they basically define the same structure
--- with different names. The "MonadRec" name is kept
--- here basically for compatibility with the current Hugs
--- implementation. (Note that this duplication also exist
--- in the current Hugs release as well.)
---
------------------------------------------------------------------------------
-
-module Control.Monad.MonadRec (
- MonadRec(mfix)
- ) 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
-fix f = let a = f a in a
-
--- The MonadRec class definition
-
-class Monad m => MonadRec m where
- mfix :: (a -> m a) -> m a
-
--- Instances of MonadRec
-
--- Maybe:
-instance MonadRec Maybe where
- mfix f = let a = f (unJust a) in a
- where unJust (Just x) = x
-
--- List:
-instance MonadRec [] where
- mfix f = case fix (f . head) of
- [] -> []
- (x:_) -> x : mfix (tail . f)
-
--- IO:
-instance MonadRec IO where
- mfix = fixIO
-
--- Lazy State:
-instance MonadRec (LazyST.ST s) where
- mfix = LazyST.fixST
-
--- Strict State:
-instance MonadRec (ST.ST s) where
- mfix = ST.fixST