zippers:映射到最后一个痕迹

rem*_*ezx 6 haskell types zipper haskell-lens

我使用拉链镜头碰到了一个问题.考虑以下示例:

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
import Control.Lens
import Control.Zipper

data A = AA { _aa :: A }
       | AB { _ab :: B }
       deriving (Show)

data B = B deriving (Show)

makeLenses ''A
makeLenses ''B

main :: IO ()
main = do
    let a = AA $ AB $ B

        z :: Top :>> A
        z = zipper a

        zAA :: Maybe (Top :>> A :>> A)
        zAA = z & within aa

        zAB :: Maybe (Top :>> A :>> B)
        zAB = z & within (aa . ab)
    return ()
Run Code Online (Sandbox Code Playgroud)

如你所见,我可以从和Top :>> A来到.Top :>> A :>> ATop :>> A :>> B

有了ab镜头,我怎样才能从Top :>> A :>> A(zAA)移动到Top :>> A :>> B(zAB),而不使用upward- 只需用镜头覆盖最后一个面包屑?

Edw*_*ETT 2

基本上,你不能。

要更改当前焦点的类型,您需要向上移动。您将要“密封”的类型已经被固定在拉链内部。它包含已经让您到达这一点的遍历或镜头的后半部分。您已经打开了镜头或遍历,并且“向上”通过将更改写回到周围的上下文中来封闭更改。