2015-01-08 4 views
6

zipperslens을 사용하여 문제가 발생했습니다. 예를 들어 다음과 같은 고려 : 당신이 볼 수 있듯이, 내가 Top :>> A :>> ATop :>> A :>> BTop :>> A 중 하나를 이동할 수지퍼 : 마지막 탐색 경로 위로 매핑

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

. 다만 마지막 이동 경로를 통해 렌즈를 매핑 -

upward를 사용하지 않고, 어떻게 Top :>> A :>> B (zAB)에 (zAA) Top :>> A :>> A에서 이동할 수 ab 렌즈가 있습니까?

답변

2

기본적으로 할 수 없습니다.

현재 포커스 유형을 변경하려면 위쪽으로 이동해야합니다. '씰링'하는 유형은 이미 지퍼 내부에 맡겨져 있습니다. 그것은 당신에게 이미이 시점에 도달 한 순회 또는 렌즈의 두 번째 절반을 포함합니다. 이미 렌즈 또는 탐색을 열었고 '위쪽으로'변경 사항을 주변 환경에 다시 기록하여 변경을 차단합니다.