2015-01-08 10 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() 

abレンズを備えた

、どのように私はupwardを使用せず、Top :>> A :>> BzAB)へTop :>> A :>> AzAA)から移動することができます - ちょうど最後のパンくずリストの上にレンズをマッピングしますか?

答えて

2

基本的にはできません。

現在のフォーカスのタイプを変更するには、上に移動する必要があります。 「密封する」タイプはすでにジッパーの内側に託されています。これはあなたにこの時点まであなたを得たトラバーサルまたはレンズの後半部分を含んでいます。すでにレンズやトラバーサルを開いていて、「上向き」は周囲の文脈に書き戻すことで変更を封印します。

関連する問題