1 -----------------------------------------------------------------------------
3 -- Module : Control.Monad.Identity
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)
8 -- Maintainer : libraries@haskell.org
9 -- Stability : experimental
10 -- Portability : portable
12 -- $Id: Identity.hs,v 1.2 2002/04/24 16:31:38 simonmar Exp $
14 -- The Identity monad.
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.}
22 -----------------------------------------------------------------------------
24 module Control.Monad.Identity (
28 module Control.Monad.Fix,
34 import Control.Monad.Fix
36 -- ---------------------------------------------------------------------------
39 -- Abstraction for wrapping up a object.
40 -- If you have an monadic function, say:
42 -- example :: Int -> IdentityMonad Int
43 -- example x = return (x*x)
45 -- you can "run" it, using
47 -- Main> runIdentity (example 42)
50 newtype Identity a = Identity { runIdentity :: a }
52 -- ---------------------------------------------------------------------------
53 -- Identity instances for Functor and Monad
55 instance Functor Identity where
56 fmap f m = Identity (f (runIdentity m))
58 instance Monad Identity where
60 m >>= k = k (runIdentity m)
62 instance MonadFix Identity where
63 mfix f = Identity (fix (runIdentity . f))