Haskell 关于拉链上移法的几个问题
我正在Haskell维基上阅读 我无法理解Haskell 关于拉链上移法的几个问题,haskell,functional-programming,zipper,Haskell,Functional Programming,Zipper,我正在Haskell维基上阅读 我无法理解up方法定义为: data Tree a = Fork (Tree a) (Tree a) | Leaf a data Cxt a = Top | L (Cxt a) (Tree a) | R (Tree a) (Cxt a) type Loc a = (Tree a, Cxt a) up :: Loc a -> Loc a up (t, L c r) = (Fork t r, c) up (t, R l c) = (Fork l t, c)
up
方法定义为:
data Tree a = Fork (Tree a) (Tree a) | Leaf a
data Cxt a = Top | L (Cxt a) (Tree a) | R (Tree a) (Cxt a)
type Loc a = (Tree a, Cxt a)
up :: Loc a -> Loc a
up (t, L c r) = (Fork t r, c)
up (t, R l c) = (Fork l t, c)
在模式up(t,lcr)
中,t
是有焦点的子树,c
是当前焦点上有一个洞的上下文,当向上移动时,为什么c
没有向上移动,但仍然引用旧上下文?焦点不也应该上升吗 In
up (t, L c r) = (Fork t r, c)
当前上下文不是c
,而是lcr
。上下文描述了从当前树到根的路径。形式为lcr
的上下文源于降序到一个左子树,因此为了上一层,我们必须将它与相应的右子树r
相结合。c
是到根的剩余路径,因此成为新上下文
让我们看一个小例子:假设您有一棵如下所示的树:
*
/ \
/ \
/ \ / \
1 2 3 4
它将使用树
类型表示为
tree = Fork (Fork (Leaf 1) (Leaf 2))
(Fork (Leaf 3) (Leaf 4))
现在,在树中选择叶3
的位置如下所示:
loc3 = (Leaf 3, L (R (Fork (Leaf 1) (Leaf 2)) Top) (Leaf 4))
请注意,这里的上下文是
L c (Leaf 4)
指示在从当前节点开始的路径上,您位于
父节点,对应的右子树是Leaf 4
。c
是上下文
对于其余步骤,在这种情况下,树分叉(叶3)(叶4)
实际上是
完整树的正确子树。两年前我在SO上问了同样的问题,当时我对你的答案不相信,现在我接受这两个问题。谢谢