On Mon, May 12, 2008 at 6:09 PM, John Hamilton <[EMAIL PROTECTED]> wrote: > I'm trying to understand how short circuiting works with the Maybe monad. > Take the expression n >>= f >>= g >>= h, which can be written as > (((n >>= f) >>= g) >>= h) because >>= is left associative. If n is > Nothing, this implies that (n >>= f) is Nothing, and so on, each nested > sub-expression easily evaluating to Nothing, but without there being a > quick way to short circuit at the beginning.
Yes, but that's still a 'quick' short-circuiting. In your example, if 'n' is Nothing, then the 'f >>= g >>= h' thunks will not be forced (thanks to lazy evaluation), regardless of associativity. Tracing verifies this: > import Debug.Trace > talk s = Just . (trace s) > f = talk "--f" > g = talk "--g" > h = talk "--h" > foo n = n >>= f >>= g >>= h *Main> foo (Just 3) Just --h --g --f 3 *Main> foo Nothing Nothing I suspect the cost of creating and discarding those unused thunks is negligible, so in effect the associativity of the bind operator is irrelevant here. Graham _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
