9

次のコードはコンパイルされません。

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens

data MyType = MyType Int
data Outer = Outer { _inners :: [ Inner ] }
data Inner = Inner { _val :: MyType }

$(makeLenses ''Outer)
$(makeLenses ''Inner)

i1 = Inner (MyType 1)
i2 = Inner (MyType 2)

o = Outer [i1, i2]

x = o ^. inners . ix 0 . val

このエラーを与える

Toy.hs:17:23:
No instance for (Data.Monoid.Monoid MyType)
  arising from a use of `ix'
Possible fix:
  add an instance declaration for (Data.Monoid.Monoid MyType)
In the first argument of `(.)', namely `ix 0'
In the second argument of `(.)', namely `ix 0 . val'
In the second argument of `(^.)', namely `inners . ix 0 . val'

MyType がモノイドであることが意味をなさないと仮定すると、このネストされたフィールドにアクセスできるようにする Lens (または Traversal、または最も適切なもの - 区別がわかりません) を取得するにはどうすればよいですか? できれば、読み取りと更新の両方の機能を備えています。

4

1 に答える 1