我想创建一个将Map k [v]
(Data.Map.Strict)转换为Maybe (Map k v)
的函数。
它是做什么的:
Nothing
。 Just
中的预期映射。 我唯一想到的就是使用
foldrWithKey'
或foldlWithKey'
手动执行此操作。有更好的方法吗? 最佳答案
您正在从 traverse :: (Traverseable t, Applicative f) => (a -> f b) -> t a -> f (t b)
(也在Prelude中)中寻找Data.Traversable
。
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
只是这些的概括。