是否有更好的方法来做地图k [v] - >也许(地图k v)?

时间:2016-11-20 21:27:33

标签: haskell

我想创建一个将Map k [v]Data.Map.Strict)转换为Maybe (Map k v)的函数。

它的作用是:

  • 如果任何列表中没有一个元素,则该函数返回Nothing
  • 如果所有列表只有一个元素,则返回包含在Just中的预期地图。

我唯一能想到的是使用foldrWithKey'foldlWithKey'手动执行此操作。还有更好的方法吗?

1 个答案:

答案 0 :(得分:18)

您正在寻找Data.Traversable traverse :: (Traverseable t, Applicative f) => (a -> f b) -> t a -> f (t b)(但也在前奏曲中)。

justOne :: [a] -> Maybe a
justOne [x] = Just x
justOne _ = Nothing

allJustOne :: Map k [v] -> Maybe (Map k v)
allJustOne = traverse justOne

traverse f最好被理解为sequenceA . fmap f。另一方面,sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)是一种拉动应用效果的方法。超出Traversable结构。例如,可以使用IO执行sequenceA :: [IO a] -> IO [a]个操作列表。或者在Maybe的情况下,如果Just结构中的所有元素都为Traversable且任何元素为Just,则结果为Nothing sequenceA的结果也是Nothing

如果您知道sequencemapM,则sequenceAtraverse只是其中的概括。