-{-# OPTIONS -fno-implicit-prelude #-}
-----------------------------------------------------------------------------
---
+-- |
-- Module : Control.Monad.Fix
-- Copyright : (c) Andy Gill 2001,
-- (c) Oregon Graduate Institute of Science and Technology, 2001
-- Stability : experimental
-- Portability : portable
--
--- $Id: Fix.hs,v 1.2 2001/07/03 11:37:49 simonmar Exp $
---
-- The Fix monad.
--
-- Inspired by the paper:
fix -- :: (a -> a) -> a
) where
-#ifdef __GLASGOW_HASKELL__
--- MonadFix is needed by System.IO, so it is below the Prelude.
-import Control.Monad
-import GHC.Base
-import GHC.Err
-import Data.Maybe
-#endif
+import Prelude
+import System.IO
fix :: (a -> a) -> a
fix f = let x = f x in x
class (Monad m) => MonadFix m where
mfix :: (a -> m a) -> m a
--- Perhaps these should live beside (the ST & IO) definition.
instance MonadFix Maybe where
mfix f = let
a = f $ case a of
Just x -> x
_ -> error "empty mfix argument"
in a
+
+instance MonadFix IO where
+ mfix = fixIO
+