[Haskell-cafe] Re: A question about mfix
Wei Hu
weihu at cs.virginia.edu
Wed Jul 30 00:18:12 EDT 2008
So that's also why the fix function from Data.Function is defined as
> fix f = let x = f x in x
instead of
> fix f = f $ fix f
right?
But, I think my mfix definition and your mfixLazy definition are still
semantically equivalent because they expand to the same thing. See the
following example:
> import Control.Monad.Identity
> -- Strict Identity monad
> data IdentityS a = IdentityS { runIdentityS :: a } deriving Show
> instance Monad IdentityS where
> return = IdentityS
> (IdentityS m) >>= k = k m
> mfix' f = mfix' f >>= f
> mfixLazy f = let x = x >>= f in x
> facFM f = return (\i ->
> if i == 0
> then 1
> else i * f (i - 1)
> )
> -- correctly outputs 3! = 6
> test = runIdentity (mfix facFM) 3
> -- stack overflows
> test2 = runIdentityS (mfix' facFM) 3
> -- hangs
> test3 = runIdentityS (mfixLazy facFM) 3
Thanks for pointing out the sharing part. My original question is still
unanswered: for lazy monads, can we give such a general mfix definition?
More information about the Haskell-Cafe
mailing list