我想创建一个将Map k [v]
(Data.Map.Strict)转换为Maybe (Map k v)
的函数。
它的作用是:
Nothing
。Just
中的预期地图。我唯一能想到的是使用foldrWithKey'
或foldlWithKey'
手动执行此操作。还有更好的方法吗?
答案 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
。
如果您知道sequence
或mapM
,则sequenceA
和traverse
只是其中的概括。