dictionary - Haskell:地图上的遍历
问题描述
我正在寻找具有此签名的函数:
chainTraversal :: k -> (k -> a -> Maybe (k, b)) -> Map k a -> Map k b
你给它一个初始键,一个函数和一个地图。
它将提取k
Map 中该位置的元素,并将该元素提供给函数。基于此,该函数将返回另一个键以查看下一步。
这是过滤器和遍历之间的某种混合,元素本身给出了下一个要打开的位置。结果是已遍历的元素列表。它可以比原始地图短。
编辑:考虑到评论。
解决方案
由于所有查找都是在原始地图中完成的:
foo :: k -> (k -> a -> Maybe (k, b)) -> Map k a -> Map k b
foo k f m = fromList $ unfoldr g k
where
g k = (\(k', b) -> (k', (k, b))) -- k ? k' ? you decide
<$> (f' k =<< (m `at` k))
f' k (k', a) = f k a -- or: f k' a ? you decide
或类似的东西。
您必须根据您选择at
的功能之一来实现该功能。lookupNN
它不是过滤器,因为它必须Nothing
在f
.
推荐阅读
- json-api - 复杂 JSON API 属性上的稀疏字段
- java - 当我在 ActionListener 中使用时,它会停止
- postgresql - 如何在 POSTGRESQL 中按小时分组并将缺失的小时数设为 0
- bash - 如何在不解压缩的情况下从 gzip 文件中删除第一行?
- c++ - 如何在 Visual Studio 2019 中步入 OpenCV 源代码
- configuration - 以符合人体工程学的方式进行配置处理的 lib
- javascript - 如何使用对象属性过滤数组对象
- java - 仅用于带注释的类的 Java 方法参数
- firebase - 从 Firebase 获取 ID 数组(DART/Flutter)
- sql-server - 以交换方式添加上一行值