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)

我正在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(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上问了同样的问题,当时我对你的答案不相信,现在我接受这两个问题。谢谢