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 处停止。