
On Wed, Mar 4, 2009 at 12:53 PM, Cristiano Paris
I'd (and indeed I did) write 'update' as:
update z x = z { this = this z >> Just x }
exploiting the '>>' operator's logic. How would this differ from the corresponding 'update' in the original Huet's FP? Maybe I don't get how my update would impact performances. In both cases the update functions leave context unchanged, don't they? If my update function have to replicate the context since functional values are immutable, doesn't Huet's do the same?
Thank you for any further comments.
The problem is that your zipper structure is too open, you don't have any specification of the "zipper laws". For example, I'd expect that for any zipper z, one of the following holds: a) moveUp z = Nothing b) moveUp z >>= moveLeft = Just z c) moveUp z >>= moveRight = Just z 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. -- ryan