我在使用 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 限制是存在的,所以 …
我想知道 Haskell 中是否有身份镜头。一个镜头identity,如果我有一个类型data MyType = MyType { _myField :: Int },那么我可以做到myType ^. identity . myField .~ 2 。似乎有一个lens-1.1.1,但我在 中找不到lens-4.19.2。