Ci sono molte funzioni che realizzano la stessa cosa, ma usando Applicative contro Monad definizioni.
Alcuni esempi sono:
-
(<*>)vsap -
purevsreturn -
(*>)vs(>>) -
traversevsmapM -
sequenceAvssequence -
liftAvsliftM -
liftA2vsliftM2 - ecc.
E per Alternative rispetto a MonadPlus :
-
emptyvsmzero -
(<|>)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.