9

私はレンズ パッケージを使用していますが、次の問題に対する簡単な解決策があるに違いないと考え続けています。いくつかのマップ (または任意のAtインスタンス) とその値型のレンズがあるとします。

aMap :: Map Int a
aLens :: Simple Lens a b

ゲッターが欲しい

g :: Getter (Map Int a) (Maybe b)

これは、私がしばしばこのようなことをしたいからです。

x :: Maybe b
x = aMap^.at 3.g.aLens

もちろん、意図されたセマンティクスは、ルックアップなどでそうJustするときに値を取得することです。atNothing

traverseの代わりに作品を取得する代わりに設定しているときg、つまり

newMap = at 3.traverse.aLens .~ whatever $ aMap

しかし、あなたが得ているときではありません。私が単に見逃したライブラリに組み込まれたレンズはありますか、それとも単一の式でこれを達成する別の簡単な方法はありますか?

4

2 に答える 2

4

でレンズを構成しようとして、同様の問題に遭遇しましたat

atここの挿入/削除動作が必要ない場合は、ix?

x :: Maybe b
x = aMap ^? ix 3 . aLens
于 2013-04-02T21:37:48.587 に答える
3

私は思いつくことができました

x :: Maybe b
x = aMap^.at 3 <&> (^.aLens)

これは少し紛らわしく、まさに私が探していたものではありませんが、仕事は完了します。

于 2013-04-02T20:03:02.913 に答える