Wie können Sie dies tun in einer imperativen Pseudo-Code?
for each element x in [a,b]:
for each element y in [c,d]:
produce (x,y)
In Haskell, wird dies geschrieben als
outerProduct xs ys =
do
x <- xs -- for each x drawn from xs:
y <- ys -- for each y drawn from ys:
return (x,y) -- produce the (x,y) pair
(folgende Kommentare von leftaroundabout) dies natürlich extrem dicht an wie liftM2
monadischen combinator definiert ist, so in Tatsache
outerProduct = liftM2 (,)
, das ist das gleiche wie liftA2 (,)
, und seine verschiedenen schreibt in Bezug auf Listenerfassungen, concatMap
Funktion, , <$>
und <*>
Betreiber.
Konzeptionell obwohl dies ist der Stoff, der Applicative
–, die besser als Pairing
genannt werden würde, – weil diese Paarung der Elemente von zwei „Container“ ⁄ „Träger“ ⁄ was ist genau das, was Applicative Functor im Begriff ist, . Es passiert einfach, dass Haskells do
Notation für Monaden funktioniert, und nicht (noch) for applicatives.
In gewissem Sinne Kompilierung- verschachtelten Schleifen Applicative ⁄ Pairing functors sind; Monaden fügen die Fähigkeit hinzu, verschachtelte Schleifen spontan zu erstellen, abhängig von den Werten, die von einer "äußeren" Enumeration erzeugt werden.
Wenn die Typen von '[a, b]' und '[c, d]' gleich sind, können Sie 'sequence [[a, b], [c, d]]' 'schreiben. – user3237465