2015-01-08 15 views
6

Ho riscontrato un problema utilizzando zippers e . Considero seguente esempio:: mappatura sull'ultimo breadcrumb

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

Come potete vedere, posso passare da Top :>> A sia per Top :>> A :>> A e Top :>> A :>> B.

Avendo ab lente, come posso passare da Top :>> A :>> A (zAA) per Top :>> A :>> B (zAB), senza l'utilizzo di upward - basta mappare con lente rispetto allo scorso breadcrumb?

risposta

2

Fondamentalmente, non è possibile.

Per modificare il tipo di messa a fuoco corrente, è necessario spostarsi verso l'alto. Il tipo con cui ti stai "sigillando" è già stato inserito nella cerniera. Contiene la seconda metà della traversata o dell'obiettivo che ti ha già portato a questo punto. Hai già aperto l'obiettivo o la traversata e "verso l'alto" sigilla le modifiche scrivendole nel contesto circostante.