import Prelude
import System.IO
-
--- | @'fix' f@ is the least fixed point of the function @f@,
--- i.e. the least defined @x@ such that @f x = x@.
-fix :: (a -> a) -> a
-fix f = let x = f x in x
+import Control.Monad.Instances ()
+import Data.Function (fix)
-- | Monads having fixed points with a \'knot-tying\' semantics.
-- Instances of 'MonadFix' should satisfy the following laws:
-- @'mfix' ('return' . h) = 'return' ('fix' h)@
--
-- [/left shrinking/ (or /tightening/)]
--- @'mfix' (\\x -> a >>= \\y -> f x y) = \\y -> 'mfix' (\\x -> f x y)@
+-- @'mfix' (\\x -> a >>= \\y -> f x y) = a >>= \\y -> 'mfix' (\\x -> f x y)@
--
-- [/sliding/]
-- @'mfix' ('Control.Monad.liftM' h . f) = 'Control.Monad.liftM' h ('mfix' (f . h))@,
-- IO:
instance MonadFix IO where
mfix = fixIO
+
+instance MonadFix ((->) r) where
+ mfix f = \ r -> let a = f a r in a