2015-01-08 15 views
6

Tôi đã gặp sự cố khi sử dụng zipperslens. Xem xét sau Ví dụ:dây kéo: ánh xạ trên đường dẫn cuối cùng

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

Như bạn thấy, tôi có thể di chuyển từ Top :>> A hoặc để Top :>> A :>> ATop :>> A :>> B.

ab ống kính, làm thế nào tôi có thể di chuyển từ Top :>> A :>> A (zAA) để Top :>> A :>> B (zAB), mà không sử dụng upward - chỉ cần lập bản đồ với ống kính trên mẩu bánh mì cuối cùng?

Trả lời

2

Về cơ bản, bạn không thể.

Để thay đổi loại trọng tâm hiện tại bạn cần di chuyển lên trên. Các loại bạn sẽ được 'niêm phong với' đã được cam kết bên trong dây kéo. Nó chứa nửa thứ hai của các traversal hoặc ống kính mà bạn đã đến thời điểm này rồi. Bạn đã mở ống kính hoặc traversal đã được và 'upwards' niêm phong ra khỏi những thay đổi bằng cách viết chúng trở lại vào bối cảnh xung quanh.

Các vấn đề liên quan