Gibt es bessere Möglichkeiten, Map k [v] - Maybe (Map k v) zu machen?

8

Ich möchte eine Funktion erstellen, die Map k [v] ( Data) aktiviert .Map.Strict ) in Maybe (Map k v) .

Was es macht ist das:

  • Wenn eine der Listen nicht genau ein Element enthält, gibt die Funktion Nothing .
  • zurück
  • Wenn alle Listen genau ein Element enthalten, wird die erwartete Karte in einem Just zurückgegeben.

Das Einzige, was mir einfällt, ist, das manuell mit foldrWithKey' oder foldlWithKey' zu machen. Gibt es bessere Möglichkeiten?

    
haskellHQ 20.11.2016, 21:27
quelle

1 Antwort

18

Sie suchen traverse :: (Traverseable t, Applicative f) => (a -> f b) -> t a -> f (t b) von Data.Traversable (aber auch im Präludium).

%Vor%

traverse f wird wahrscheinlich am besten als sequenceA . fmap f verstanden. sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a) ist andererseits eine Möglichkeit, die anwendbaren "Effekte" aus einer Traversable -Struktur herauszuziehen. Zum Beispiel könnte man eine Liste von IO Aktionen mit sequenceA :: [IO a] -> IO [a] ausführen. Oder im Fall von Maybe ist das Ergebnis Just , wenn alle Elemente in der Traversable Struktur Just sind und wenn eines der Elemente Nothing ist, wird das Ergebnis von sequenceA auch% co_de sein %.

Wenn Sie Nothing oder sequence kennen, sind mapM und sequenceA nur Verallgemeinerungen davon.

    
jpath 20.11.2016, 21:34
quelle

Tags und Links