[project @ 2002-04-24 16:31:37 by simonmar]
[packages/base.git] / Control / Monad / Fix.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module : Control.Monad.Fix
4 -- Copyright : (c) Andy Gill 2001,
5 -- (c) Oregon Graduate Institute of Science and Technology, 2001
6 -- License : BSD-style (see the file libraries/core/LICENSE)
7 --
8 -- Maintainer : libraries@haskell.org
9 -- Stability : experimental
10 -- Portability : portable
11 --
12 -- $Id: Fix.hs,v 1.5 2002/04/24 16:31:38 simonmar Exp $
13 --
14 -- The Fix monad.
15 --
16 -- Inspired by the paper:
17 -- \em{Functional Programming with Overloading and
18 -- Higher-Order Polymorphism},
19 -- \A[HREF="http://www.cse.ogi.edu/~mpj"]{Mark P Jones},
20 -- Advanced School of Functional Programming, 1995.}
21 --
22 -----------------------------------------------------------------------------
23
24 module Control.Monad.Fix (
25 MonadFix(
26 mfix -- :: (a -> m a) -> m a
27 ),
28 fix -- :: (a -> a) -> a
29 ) where
30
31 import Prelude
32 import System.IO
33
34 fix :: (a -> a) -> a
35 fix f = let x = f x in x
36
37 class (Monad m) => MonadFix m where
38 mfix :: (a -> m a) -> m a
39
40 instance MonadFix Maybe where
41 mfix f = let
42 a = f $ case a of
43 Just x -> x
44 _ -> error "empty mfix argument"
45 in a
46
47 instance MonadFix IO where
48 mfix = fixIO
49