Warum die Anwendung von `Sequenz` auf die Liste der Listen führen die Berechnung von deren Kartesisches Produkt?
Meine Frage ist über die sequence
Funktion in Prelude
, die Signatur ist wie folgt:
sequence :: Monad m => [m a] -> m [a]
Verstehe ich, wie diese Funktion arbeitet für List
von Maybe
s. Zum Beispiel die Anwendung sequence
auf [Just 3, Just 9]
gibt Just [3, 9]
.
Bemerkte ich, dass die Anwendung sequence
auf List
von List
s gibt deren Kartesisches Produkt. Kann mir bitte jemand helfen zu verstehen, wie/warum das passiert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies funktioniert, weil die Verwendung von Listen als Monaden in Haskell macht Sie Modell indeterminism. Bedenken Sie:
Per definition ist dies das gleiche wie:
Nur Lesen es als "Erste Wahl zwischen 1 und 2, dann die Wahl zwischen 3 und 4". Die list Monade nun sammeln alle Ergebnisse möglich - daher ist die Antwort
[[1,3],[1,4],[2,3],[2,4]]
.(für noch mehr verschleiert Beispiel, siehe hier)
sequence
wirkt, als ob es waren, die wie folgt definiert.(Oder
sequence = foldr (liftM2 (:)) (return [])
aber trotzdem...)Nur daran denken, was passiert, wenn angewendet auf eine Liste von Listen.
Nur um zu erklären, warum die Anwendung der Sequenz in eine Liste von Listen ist so Verschieden von der Anwendung der Sequenz, um eine Liste der Vielleicht-Werte:
Wenn Sie
sequence
zu einer Liste von Listen, dann ist der Typ der Sequenz ist eine Spezialisierung von(mit den typkonstruktor m auf [])
(das ist das gleiche wie
sequence :: [[a]] -> [[a]]
)intern-Sequenz verwendet (>>=) - D. H. der monadischen bind-Funktion. Für Listen, die das bind-Funktion implementiert ist komplett anders als bei m setzen, um Vielleicht!