haskell - 是否有可以用来深入挖掘多维地图的镜头/光学器件?
问题描述
我在使用带有地图的镜头时遇到了一些困难。我有看起来像这样的地图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 限制的光学元件,如果我尝试使用一个键进行索引,那只会抛出一个致命错误不存在。有可能自己创造这样的东西吗?
解决方案
推荐阅读
- c# - 从 JWT 验证 User.Identity
- sql - PostgreSQL:仅当表存在时才从表中选择
- python - 从 unittest 中调用 subprocess.Popen 失败,但从 __main__ 调用时有效
- python - SQLAlchemy:通过删除重复项并保留最大值来选择 DISTINCT ON 列
- d3.js - 使圆环图可点击
- json - 如何使用聚合在 MongoDB 中的文档根目录中输出数组对象?
- python-3.x - 在包中设计通用类定义的pythonic方式是什么?
- angular - Angular 应用程序在本地工作,但在部署时返回 404
- reactjs - 空白 React.JS 结果
- java - MongoDB 文档和集合为空