X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=week11.mdwn;h=0128a5da9bbc933e7b961aa64a2685dec8ace7cc;hp=1857d8b988836b22dc691e2238a5d69e6cf9e65a;hb=339b62e48b39fadd325d9e0dc903430c4a896870;hpb=21d43bf1749e0f6329a481ab8d4c5726a13e7011 diff --git a/week11.mdwn b/week11.mdwn index 1857d8b9..0128a5da 100644 --- a/week11.mdwn +++ b/week11.mdwn @@ -1,22 +1,11 @@ These notes may change in the next few days (today is 30 Nov 2010). The material here benefited from many discussions with Ken Shan. -[[!toc]] +##[[Tree and List Zippers]]## -##List Zippers## +##[[Coroutines and Aborts]]## -Say you've got some moderately-complex function for searching through a list, for example: - - let find_nth (test : 'a -> bool) (n : int) (lst : 'a list) : (int * 'a) -> - let rec helper (position : int) n lst = - match lst with - | [] -> failwith "not found" - | x :: xs when test x -> (if n = 1 - then (position, x) - else helper (position + 1) (n - 1) xs - ) - | x :: xs -> helper (position + 1) n xs - in helper 0 n lst;; +##[[From Lists to Continuations]]## This searches for the `n`th element of a list that satisfies the predicate `test`, and returns a pair containing the position of that element, and the element itself. Good. But now what if you wanted to retrieve a different kind of information, such as the `n`th element matching `test`, together with its preceding and succeeding elements? In a real situation, you'd want to develop some good strategy for reporting when the target element doesn't have a predecessor and successor; but we'll just simplify here and report them as having some default value: @@ -1760,4 +1749,7 @@ called a that is intended to represent non-deterministic computations as a tree. +##[[List Monad as Continuation Monad]]## + +##[[Manipulating Trees with Monads]]##