2015-01-08 10 views
6

Ich habe ein Problem mit und lens gestoßen. Betrachten Sie folgendes Beispiel:Zipper: Mapping über den letzten 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() 

Wie Sie sehen können, habe ich von Top :>> A entweder zu Top :>> A :>> A und Top :>> A :>> B bewegen kann.

Mit ab Linse, wie kann ich von Top :>> A :>> A bewegen (zAA) zu Top :>> A :>> B (zAB), ohne upward mit - nur der Abbildung mit Objektiv über letzten Brotkrümel?

Antwort

2

Grundsätzlich können Sie nicht.

Um den Typ des aktuellen Fokus zu ändern, müssen Sie sich nach oben bewegen. Der Typ, mit dem du dich versiegelst, wurde bereits in den Reißverschluss gesteckt. Es enthält die zweite Hälfte des Traversals oder der Linse, die Sie bereits zu diesem Punkt gebracht hat. Sie haben die Linse oder das Traversal bereits geöffnet und "nach oben" dichtet die Änderungen ab, indem sie in den umgebenden Kontext zurückgeschrieben werden.