zippers:映射到最后一个痕迹

时间:2015-01-08 16:48:25

标签: haskell types lens zipper

我使用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 :>> A移至Top :>> A :>> ATop :>> A :>> B

拥有ab镜头,如何在不使用Top :>> A :>> A的情况下从zAATop :>> A :>> B)移至zABupward) - 只是将镜头映射到最后一个痕迹上?

1 个答案:

答案 0 :(得分:2)

基本上,你不能。

要更改当前焦点的类型,您需要向上移动。你将要“密封”的类型已经致力于拉链内部。它包含遍历或透镜的后半部分,已经达到了这一点。你已经打开了镜头或遍历,并且通过将它们写回到周围的环境中,“向上”密封了变化。