From the earlier response, I understand that:
((->) r)
is an instance of Monad, but I haven't found a definition of the Monad instance functions. I think these do the job, and they satisfy the monad laws [2]:
[[
instance Monad ((->) r) where
return a = const a
g1 >>= f = \e -> f (g1 e) e
]]Can anyone confirm, or point me at an actual definition?
#g --
[1] http://haskell.org/pipermail/haskell-cafe/2003-November/005566.html
[2] Checking the Monad laws for the above definitions
(cf. Haskell report p90):(A)
return a >>= k
= [g1/const a][f/k] \e -> f (g1 e) e
= \e -> k (const a e) e
= \e -> k a e
= k a -- as required.(B)
m >>= return
= [g1/m][f/const] \e -> f (g1 e) e
= \e -> const (m e) e
= \e -> (m e)
= m -- as required.(C)
m >>= (\x -> k x >>= h)
= [g1/m][f/(\x -> k x >>= h)] \e -> f (g1 e) e
= \e -> (\x -> k x >>= h) (m e) e
= \e -> (k (m e) >>= h) e
= \e -> ([g1/k (m e)][f/h] \e1 -> f (g1 e1) e1) e
= \e -> (\e1 -> h (k (m e) e1) e1) e
= \e -> h (k (m e) e) e (m >>= k) >>= h
= ([g1/m][f/k] \e -> f (g1 e) e) >>= h
= (\e -> k (m e) e) >>= h
= [g1/(\e -> k (m e) e)][f/h] \e1 -> f (g1 e1) e1
= \e1 -> h ((\e -> k (m e) e) e1) e1
= \e1 -> h (k (m e1) e1) e1
= \e -> h (k (m e) e) eSo both expressions are equivalent, as required.
------------ Graham Klyne For email: http://www.ninebynine.org/#Contact
_______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
