首页 > 解决方案 > Haskell:地图上的遍历

问题描述

我正在寻找具有此签名的函数:

chainTraversal :: k -> (k -> a -> Maybe (k, b)) -> Map k a -> Map k b

你给它一个初始键,一个函数和一个地图。

它将提取kMap 中该位置的元素,并将该元素提供给函数。基于此,该函数将返回另一个键以查看下一步。

这是过滤器和遍历之间的某种混合,元素本身给出了下一个要打开的位置。结果是已遍历的元素列表。它可以比原始地图短。

编辑:考虑到评论。

标签: dictionaryhaskelltraversal

解决方案


由于所有查找都是在原始地图中完成的:

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

它不是过滤器,因为它必须Nothingf.


推荐阅读