首页 > 解决方案 > 是否有可以用来深入挖掘多维地图的镜头/光学器件?

问题描述

我在使用带有地图的镜头时遇到了一些困难。我有看起来像这样的地图Map String (Map String Int)。这些是多维数组,我通常将它们设置为已知维度。我经常想读取和更新这些地图的元素,而不是添加或删除元素。

我想要一个类似于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 () 

不幸的是,我不能使用ix "k1" . ix "k2",因为它v = m ^. ix "k1" . ix "k2"不会编译,因为Int它不是 Monoid。一般来说,我不能有这个 Monoid 限制,因为我通常在我的地图中保存相当复杂的值(比如一些复杂的状态 ADT)。(我猜这个 Monoid 限制是存在的,所以ix如果键不存在,它可以返回一个默认值。)我想要一个没有这个 Monoid 限制的光学元件,如果我尝试使用一个键进行索引,那只会抛出一个致命错误不存在。有可能自己创造这样的东西吗?

标签: haskelllenses

解决方案


推荐阅读