come si può fare questo in un pseudocodice imperativo?
for each element x in [a,b]:
for each element y in [c,d]:
produce (x,y)
In Haskell, questo è scritto come
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
(commenti di leftaroundabout) questo è naturalmente estremamente vicino a come liftM2
combinatore monadica è definita, quindi in fact
outerProduct = liftM2 (,)
che è lo stesso di liftA2 (,)
e le sue varie riscritture in termini di comprensione delle liste, funzione concatMap
, >>=
, <$>
e <*>
.
Concettualmente se questa è la roba del Applicative
– che sarebbe meglio chiamato come Pairing
, – perché questo abbinamento di elementi di due "contenitori" ⁄ "vettori" ⁄ qualunque è esattamente quello applicativo Functor è di circa . Accade semplicemente che la notazione do
di Haskell funzioni per le monade e non (ancora) for applicatives.
in un certo senso di compilazione cicli annidati sono applicativo ⁄ funtori Abbinamento; Le Monade aggiungono la possibilità di creare loop annidati al volo, a seconda dei valori prodotti da un'enumerazione "esterna".
fonte
2015-08-19 11:19:48
Quando i tipi di '[a, b]' e '[c, d]' sono uguali, è possibile scrivere 'sequence [[a, b], [c, d]]'. – user3237465