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- 只需用镜头覆盖最后一个面包屑?
基本上,你不能。
要更改当前焦点的类型,您需要向上移动。您将要“密封”的类型已经被固定在拉链内部。它包含已经让您到达这一点的遍历或镜头的后半部分。您已经打开了镜头或遍历,并且“向上”通过将更改写回到周围的上下文中来封闭更改。