Haskell 拉链:映射最后一个面包屑

Haskell 拉链:映射最后一个面包屑,haskell,types,haskell-lens,zipper,Haskell,Types,Haskell Lens,Zipper,我在使用和时遇到了一个问题。考虑下面的例子: {-# 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 mak

我在使用和时遇到了一个问题。考虑下面的例子:

{-# 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 ()
如您所见,我可以从
Top:>>A
移动到
Top:>>A:>>A
Top:>>A:>>B

有了
ab
lens,我如何才能从
Top:>>A:>>A(
zAA
)移动到
Top:>>A:>>B(
zAB
),而不使用
向上
——只是在最后一个面包屑上用lens映射?

基本上,你不能

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