X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=topics%2Fweek7_introducing_monads.mdwn;h=39dcdaf0649ab713cfc8799f6e5349877406e3d6;hp=0e9ab56f31b6f42592fe0dcd20801f7da6f9b892;hb=57588efa1216a1f500e9ae42521604fd2f488924;hpb=5b304e0cbe18ba3bc9b372e3ca8faf3edaa4e8e5 diff --git a/topics/week7_introducing_monads.mdwn b/topics/week7_introducing_monads.mdwn index 0e9ab56f..39dcdaf0 100644 --- a/topics/week7_introducing_monads.mdwn +++ b/topics/week7_introducing_monads.mdwn @@ -383,7 +383,7 @@ That can be helpful, but it only enables us to have _zero or one_ elements in th | [] -> [] | x' :: xs' -> List.append (k x') (catmap f xs') -Now we can have as many elements in the result for a given `α` as `k` cares to return. Another way to write `catmap k xs` is as `List.concat (map k xs)`. And this is just the definition of `mbind` or `>>=` for the List Monad. The definition of `mcomp` or `<=<`, that we gave above, differs only in that it's the way to compose two functions `j` and `k`, that you'd want to `catmap`, rather than the way to `catmap` one of those functions over a value that's already a list. +Now we can have as many elements in the result for a given `α` as `k` cares to return. Another way to write `catmap k xs` is as (Haskell) `concat (map k cs)` or (OCaml) `List.flatten (List.map k xs)`. And this is just the definition of `mbind` or `>>=` for the List Monad. The definition of `mcomp` or `<=<`, that we gave above, differs only in that it's the way to compose two functions `j` and `k`, that you'd want to `catmap`, rather than the way to `catmap` one of those functions over a value that's already a list. This example is a good intuitive basis for thinking about the notions of `mbind` and `mcomp` more generally. Thus `mbind` for the option/Maybe type takes an option value, applies `k` to its element (if there is one), and returns the resulting option value. `mbind` for a tree with `α`-labeled leaves would apply `k` to each of the leaves, and return a tree containing arbitrarily large subtrees in place of all its former leaves, depending on what `k` returned. @@ -393,11 +393,13 @@ This example is a good intuitive basis for thinking about the notions of `mbind` Some a >>=α option (\a -> Some 0) ==> Some 0 None >>=α option (\a -> Some 0) ==> None - . _____ - / \ . / \ - . 3 >>=(α,unit) tree (\a -> / \ ) ==> _/_ . - / \ a a / \ / \ -1 2 . . 3 3 + . + / \ + . / \ + / \ . . \ + . 3 >>=(α,unit) tree (\a -> / \ ) ==> / \ . + / \ a a / \ / \ +1 2 . . 3 3 / \ / \ 1 1 2 2