6

我在使用zipperslens时遇到了问题。考虑以下示例:

{-# 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 :>> ATop :>> A :>> ATop :>> A :>> B

有了ab镜头,我如何在不使用的情况下从Top :>> A :>> A( zAA) 移动到Top :>> A :>> B( ) - 只是将镜头映射到最后一个面包屑上?zABupward

4

1 回答 1

2

基本上,你不能。

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

于 2015-02-20T04:33:17.503 回答