On Mon, 08 Dec 2003 16:33:53 +0000 Graham Klyne <[EMAIL PROTECTED]> wrote:
> A little while ago, I sent a long rambling message [1] containing a > key question in response to an earlier helpful response. I guess my > ramblings were quite reasonably passed over as too much waffle, and > the question was lost. Here, I isolate the question. > > 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? http://www.haskell.org/hawiki/MonadReader There's also the source of Control.Monad.Reader (and the new library) as well as various papers containing implementations. And, as long as you didn't make a mistake below, you've proven it. Well, you've proven it's a monad in this way. > [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) e > > So both expressions are equivalent, as required. _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe