我想创建一个将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

    如果您知道sequencemapMsequenceAtraverse只是这些的概括。

    08-16 06:59