2015-01-08 28 views
6

Wpadłem na problem przy użyciu zippers i lens. Rozważmy następujący przykład:zamki błyskawiczne: odwzorowanie ostatniego bułka z masłem

{-# 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() 

Jak widać, mogę przejść z Top :>> A albo Top :>> A :>> A i Top :>> A :>> B.

Mając ab obiektyw, w jaki sposób można przejść od Top :>> A :>> A (zAA) do Top :>> A :>> B (zAB), bez używania upward - po prostu mapowania z obiektywem nad ostatnim nawigacyjnego?

Odpowiedz

2

Zasadniczo nie można.

Aby zmienić typ bieżącego fokusa, należy przesunąć go w górę. Typ, który będziesz "uszczelniać", został już umieszczony wewnątrz suwaka. Zawiera drugą połowę traversal lub soczewki, które już doprowadziły cię do tego punktu. Otworzyłeś już soczewkę lub przejście i już "w górę" odcina zmiany, zapisując je w otaczającym kontekście.