X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=assignment8.mdwn;h=256b2ce95a021045763f4b378541a7d5b17020dc;hp=495ef2f7218b10182b4e955b8d606dae4dea9c70;hb=911d868126d0b91047b362cb909cdfeb503cd16b;hpb=b0ae43400b808fc96a9762d25868d6517e904a48 diff --git a/assignment8.mdwn b/assignment8.mdwn index 495ef2f7..256b2ce9 100644 --- a/assignment8.mdwn +++ b/assignment8.mdwn @@ -2,9 +2,10 @@ type 'a tree = Leaf of 'a | Node of ('a tree * 'a tree) - type 'a starred_tree = Root | Starring_Left of 'a starred_pair | Starring_Right of 'a starred_pair - and 'a starred_pair = { parent : 'a starred_tree; sibling: 'a tree } - and 'a zipper = { tree : 'a starred_tree; filler: 'a tree };; + type 'a starred_level = Root | Starring_Left of 'a starred_nonroot | Starring_Right of 'a starred_nonroot + and 'a starred_nonroot = { parent : 'a starred_level; sibling: 'a tree };; + + type 'a zipper = { level : 'a starred_level; filler: 'a tree };; let rec move_botleft (z : 'a zipper) : 'a zipper = (* returns z if the targetted node in z has no children *) @@ -22,22 +23,19 @@ let new_zipper (t : 'a tree) : 'a zipper = - {tree = Root; filler = t} + {level = Root; filler = t} ;;   let make_fringe_enumerator (t: 'a tree) = - (* create a zipper targetting the root of t *) - let zstart = new_zipper t - in let zbotleft = move_botleft zstart + (* create a zipper targetting the botleft of t *) + let zbotleft = move_botleft (new_zipper t) (* create a refcell initially pointing to zbotleft *) in let zcell = ref (Some zbotleft) (* construct the next_leaf function *) in let next_leaf () : 'a option = match !zcell with - | None -> (* we've finished enumerating the fringe *) - None | Some z -> ( (* extract label of currently-targetted leaf *) let Leaf current = z.filler @@ -47,6 +45,8 @@ | Some z' -> Some (move_botleft z') (* return saved label *) in Some current + | None -> (* we've finished enumerating the fringe *) + None ) (* return the next_leaf function *) in next_leaf