2015-01-08 6 views
6

나는 과 zippers으로 고민 중입니다. Control.Monad.MonadPlus m => m (Zipper Top Int [Int] :>> A Int) : 코드 아래의 고려는 내가 좋아하는 지퍼의 유형을 만드는 방법, data A t = A t를 갖는 ghci'to` 렌즈로 지퍼를 끼고 넣을 때

> import Control.Lens 
> import Control.Zipper 
> 
> :t within (ix 1) $ zipper ([1,2,3] :: [Int]) 
> within (ix 1) $ zipper ([1,2,3] :: [Int]) 
    :: Control.Monad.MonadPlus m => m (Zipper Top Int [Int] :>> Int) 

에서 실행?

나는 within (ix 1 . to A) $ zipper ([1,2,3] :: [Int])을 시도했지만 오류 제공합니다

Could not deduce (Contravariant 
        (Bazaar (Indexed Int) (A Int) (A Int))) 
    arising from a use of ‘to’ 
from the context (Control.Monad.MonadPlus m) 
    bound by the inferred type of 
      it :: Control.Monad.MonadPlus m => 
       m (Zipper Top Int [Int] :>> A Int) 
    at Top level 
In the second argument of ‘(.)’, namely ‘to A’ 
In the first argument of ‘within’, namely ‘(ix 1 . to A)’ 
In the expression: within (ix 1 . to A) 

답변

2

한 가지 방법은 Iso을 그와 함께 구성하는 것입니다.

> import Control.Lens 
> import Control.Zipper 
> 
> data A t = A t 
> let _A = iso A (\(A a) -> a) 
> 
> let a = within (ix 1 . _A) $ zipper ([1,2,3] :: [Int]) 
> :t a 
a :: MonadPlus m => m (Zipper Top Int [Int] :>> A Int) 
> a ^? _Just . focus 
Just (A 2) 

편집 : ghci에서는 그 이유는 (\(A a) -> a) 그래서 당신이 밖으로 다시 얻을 수있다 필요합니다.

> data A t = A t 
> let _A = iso A (error "Can't unA") 
> 
> let a = within (ix 1 . _A) $ zipper ([1,2,3] :: [Int]) 
> a ^? _Just . focus 
Just (A 2) 
> fmap upward a ^? _Just . focus 
Just [1,*** Exception: Can't unA 

A을 추출하는 기능이없는 유효한 방법은 없을 것이라고 생각합니다. `specyfing없이 그것을 할 수있는 방법이 있나요

> data A t = A t 
> let _A f a = a <$ f (A a) 
> 
> let a = within (ix 1 . _A) $ zipper ([1,2,3] :: [Int]) 
> let b = a & _Just . focus .~ A 10 
> b ^? _Just . focus 
Just (A 10) 
> fmap upward b ^? _Just . focus 
Just [1,2,3] -- Should be Just [1, 10, 3] 
+0

을 (\ (A A) -> A)'기능 : 잘못된 Traversal 쓸 수 있지만 여전히 제대로 작동하지 않습니다? 내 경우에 그렇게 명확하지 않다면 그냥'undefined'를 여기에 전달할 수 있습니까? – remdezx

+0

아닙니다. 문제는 당신이 다시 올라갈 수 없다는 것입니다. '위로'를 사용하면 'undefined'가됩니다. – cchalmers

+1

나는 ... Iso보다 다른 옵션이 있습니까? – remdezx