4

私は深くネストされたデータ構造を持っており、Control.Lens.* を使用して、状態モナドでその値に簡単にアクセスできるようにしています。

したがって、次のことを考慮してください。

data Config = Config { _foo :: Maybe Int
                     , _bar :: Int
                     }

$(makeLenses ''Config)

メイビー上で「関数的に」操作するにはどうすればよいですか? 次のような慣用的なゲッターを書きたいと思います。

config = Config (Just 1) 0
config^.foo.to fmap (+1) == Just 2

さらに良いことに、Config がより深くネストされている場合、どのように処理すればよいでしょうか?

data Config = { _foo :: Maybe Foo }
data Foo = Foo { _bar :: Bar }
data Bar = Bar Int
$(makeLenses ''Bar)
$(makeLenses ''Foo)

アクセサー foo と bar を使用して、変更された Bar を返すことができますか?

4

1 に答える 1

13

a を使用しPrismて (おそらく)Justブランチに入ることができます。

>>> let config' = config & foo . _Just .~ (+1)
    in  config' ^. foo
Just 2

そして、これPrismは他のレンズとまったく同じように構成され、Traversalsを形成します。

foo . _Just . bar . _Bar :: Traversal' Config Int

私がレンズについて書いたいくつかのチュートリアルを見てみましょLensPrism

https://www.fpcomplete.com/user/tel/a-little-lens-starter-tutorial

https://www.fpcomplete.com/user/tel/lens-aeson-traversals-prisms

于 2013-10-24T02:47:05.913 に答える