Haskell: 在地图上遍历
Haskell: Traversal on a Map
我正在寻找具有此签名的函数:
chainTraversal :: k -> (k -> a -> Maybe (k, b)) -> Map k a -> Map k b
你给它一个初始键,一个函数和一个映射。
它将提取 Map 中 k
位置的元素,并将该元素提供给函数。基于此,函数将return另一个key看下。
它是过滤器和遍历之间的某种混合,元素本身给出了下一个要打开的位置。结果是已遍历的元素列表。可以比原图短。
编辑:考虑到评论。
没有具有该签名和行为的现有函数。你必须自己写。
由于所有查找都在原始 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
或类似的东西。
您必须根据您选择的 lookupNN
函数之一来实现 at
函数。
它不是过滤器,因为它必须在 f
生成的第一个 Nothing
处停止。
我正在寻找具有此签名的函数:
chainTraversal :: k -> (k -> a -> Maybe (k, b)) -> Map k a -> Map k b
你给它一个初始键,一个函数和一个映射。
它将提取 Map 中 k
位置的元素,并将该元素提供给函数。基于此,函数将return另一个key看下。
它是过滤器和遍历之间的某种混合,元素本身给出了下一个要打开的位置。结果是已遍历的元素列表。可以比原图短。
编辑:考虑到评论。
没有具有该签名和行为的现有函数。你必须自己写。
由于所有查找都在原始 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
或类似的东西。
您必须根据您选择的 lookupNN
函数之一来实现 at
函数。
它不是过滤器,因为它必须在 f
生成的第一个 Nothing
处停止。