有没有更好的方法来做地图k [v] - >可能(地图kv)?

has*_*lHQ 8 haskell

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

它的作用是:

  • 如果任何列表没有正好一个元素,则函数返回Nothing.
  • 如果所有列表都只有一个元素,则返回包含在a中的预期映射Just.

我唯一能想到的是用foldrWithKey'或手动完成foldlWithKey'.还有更好的方法吗?

jpa*_*ath 18

您正在寻找traverse :: (Traverseable t, Applicative f) => (a -> f b) -> t a -> f (t b)Data.Traversable(而且在序曲).

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

allJustOne :: Map k [v] -> Maybe (Map k v)
allJustOne = traverse justOne
Run Code Online (Sandbox Code Playgroud)

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.

如果你知道sequence或者mapM,sequenceA并且traverse只是那些概括.

  • @jpath它使用`Alternative`,而不是`Applicative`. (2认同)