[Haskell wikibook] Article ANN: Theseus and the zipper
David House
dmhouse at gmail.com
Mon Feb 19 13:49:52 EST 2007
The following applies only to the first section, for now, which is all
I've read.
On 19/02/07, apfelmus at quantentunnel.de <apfelmus at quantentunnel.de> wrote:
> Of course, comments, corrections and criticism are welcome!
I made a single correction and expanded on one quick point:
http://en.wikibooks.org/w/index.php?title=Haskell/Zippers&diff=760692&oldid=760465
My comments, then:
1) Any reason you're not using the standard camelCase?
2) Any reason the maze datatypes take an extra parameter? For
simplicity, I'd have expected:
data Node = DeadEnd
| Passage Node
| Fork Node Node
And so on.
3) You could do with splitting the first section into various
subsections, it's a bit long and unwieldy as-is.
4) I'm not sure I like the typesetting of the conversation using lots
of <br>s, but I can't think of a better way of doing it off the top of
my head.
5) I don't really get this picture:
http://en.wikibooks.org/wiki/Image:Laybrinth-Zipper.png
Is the red bit meant to be one long, straight arrow?
6) I don't think you spend enough time with the zipper concept. I
found when I read Huet's paper that zippers were one of those
brain-exploding concepts, perhaps because everything is stored
backwards. A few suggestions that would have helped me:
* We store the entirety of the labyrinth in any zipper; by zipping all
the way to the top so that the focus is at the entrance, the
sub-labyrinth is the whole labyrinth. The reason this is done is so
that we can backtrack and take an alternate path at any point.
* We definitely need to show a zipper for another datatype, perhaps
binary trees. I suggest with this one, we break the narrative and
explain step by step what each constructor means. Something like the
following:
data BinTree a = Leaf | Node a (BinTree a) (BinTree a)
data BinThread a = Root | Left a (BinTree a) | Right (BinTree a) a
type BinZip a = (BinThread a, BinTree a)
Root = The focus is at the top of the tree.
L x t = We went left at a node where the value was x and the right subtree t.
R t x = We went right at a node where the value was x and the left subtree t.
Then give examples. The best way is probably to give an example
BinTree in a picture, pick one element out, display the zipper for
that element and explain what it means. This sound like a good plan?
As a way for the reader to confirm their knowledge, show them the
simple zipper for lists:
data List a = End | Cons a (List a)
data ListThread a = El a (List a)
type ListZip a = (ListThread a, List a)
Then set an exercise for the reader to explain to themselves how this
works. I'd set this lot just before the 'half a year later', so we can
return to the narrative as a nice ending.
I'm sure I'll think of more, but that's it for now.
--
-David House, dmhouse at gmail.com
More information about the Wikibook
mailing list