我想创建一个将Map k [v](Data.Map.Strict)转换为的函数Maybe (Map k v).
它的作用是:
Nothing.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只是那些概括.