Cristiano Paris wrote: > Ryan Ingram wrote: >> ... >> Here is the problem with your "update": >> >> tree = Fork (Leaf 1) (Leaf 2) >> ztree = initZ tree >> >> test = fromJust $ do >> z1 <- moveLeft ztree >> let z2 = update z1 3 >> z3 <- moveUp z2 >> z4 <- moveLeft z3 >> this z4 >> >> I'd expect "test" to equal 3, but I believe with your code that it >> still equals 1. As apfelmus said, update needs to completely >> re-construct the zipper structure with the tied knot, which defeats >> the purpose of using a zipper in the first place. > > I got it. I dont't know what your expression "tied knot" is referring > to but I got the point.
In doInitZ , you're basically using the s itself to define the moveLeft and moveRight fields of s . You could as well write it as initZ t = doInitZ Nothing t where doInitZ c (Leaf a) = ZContext c Nothing Nothing $ Just a doInitZ c t@(Fork l r) = s where s = ZContext c (Just $ doInitZ (Just s) l) (Just $ doInitZ (Just s) r) Nothing Such self-reference is usually called "tying the knot", see also http://www.haskell.org/haskellwiki/Tying_the_Knot Regards, apfelmus -- http://apfelmus.nfshost.com _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe