2015-01-08 8 views
6

私はlenszippersと苦労しています。 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を作り、それを構成することです。 GHCiの中:

> 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) 

編集:あなたが(\(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)の'機能:無効なTraversal書くことができますが、それはまだ正常に動作しないのだろうか?私の場合はそれが明らかではない場合、私はここに 'undefined'を渡すことができますか? – remdezx

+0

実際はありません。問題は、あなたが元に戻ることができないということです。 '上向き 'を使用して戻ってくると' undefined'が返されます。 – cchalmers

+1

私は参照してください... 'Iso'以外のオプションはありますか? – remdezx

関連する問題