2015-01-08 44 views
6

zippers ve lens kullanarak bir sorunla karşılaştım. Örneğin aşağıdaki düşünün: Gördüğünüz gibi, ben Top :>> A :>> A ve Top :>> A :>> B için Top :>> A birinden taşıyabilirsinizfermuarlar: son ekmek kırıntısı üzerinde eşleme

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

. Sadece geçen sayfa işaretinin üzerinde lens ile haritalama -

upward kullanmadan, nasıl Top :>> A :>> B (zAB) için (zAA) Top :>> A :>> A doğru hareket ediyorsa ab lens yaşıyorsunuz?

cevap

2

Temel olarak yapamazsınız.

Geçerli odağın türünü değiştirmek için yukarı doğru hareket etmeniz gerekir. 'Sızdırmayacağınız' tip, fermuarın içine zaten işlenmiştir. Sizi bu noktaya getiren traversal veya lensin ikinci yarısını içerir. Objektifi ya da geçişi zaten açtınız ve 'yukarı doğru' değişiklikleri çevreleyen içeriğe geri yazarak kapatıyor.