我在使用 Lenses 和 Maps 时遇到了一些困难。我有看起来像这样的地图Map String (Map String Int)。这些是多维数组,我通常使用已知维度设置它们。我经常想读取和更新这些 Maps 的元素,但不想添加或删除元素。
我想要一个类似于ix "k1" . ix "k2"允许我执行以下操作的光学器件:
myfunc :: Map String (Map String Int) -> ()
myfunc m =
let m' = m & ix "k1" . ix "k2" %~ (+1)
v = m ^. ix "k1" . ix "k2"
in ()
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不能使用ix "k1" . ix "k2",v = m ^. ix "k1" . ix "k2"因为Int它不是 Monoid无法编译。一般来说,我不能有这个 Monoid 限制,因为我通常在我的地图中持有相当复杂的值(比如一些复杂的状态 ADT)。(我猜这个 Monoid 限制是存在的,所以ix如果键不存在,它可以返回一个默认值。)我想要一个没有这个 Monoid 限制的光学元件,如果我尝试使用一个键进行索引,它只会抛出一个致命错误不存在。有可能自己创造这样的东西吗?