Ci sono molte funzioni che realizzano la stessa cosa, ma usando Applicative
contro Monad
definizioni.
Alcuni esempi sono:
-
(<*>)
vsap
-
pure
vsreturn
-
(*>)
vs(>>)
-
traverse
vsmapM
-
sequenceA
vssequence
-
liftA
vsliftM
-
liftA2
vsliftM2
- ecc.
E per Alternative
rispetto a MonadPlus
:
-
empty
vsmzero
-
(<|>)
vsmplus
Nello scenario che ha generato questa domanda, ho voluto traverse
/ mapM
dove Applicative
/ Monad
è []
.
In generale, quando è noto che il risultato sarà lo stesso, è meglio usare gli stili Applicative
o Monad
? Ad esempio, è più leggibile di un altro o forse più veloce dell'altro?
Modifica (in risposta viene suggerito come duplicato): Personalmente, trovo che siano ugualmente leggibili. Non sto chiedendo in alcun modo la manutenibilità, in quanto possono essere utilizzate in modo intercambiabile, e preferendo l'una rispetto all'altra non avrebbe alcun impatto sulla struttura del codice. Mi sto davvero chiedendo se uno è più idiomatico , o più efficiente , dell'altro.