Devo utilizzare le funzioni basate su Applicativi o Monade?

7

Ci sono molte funzioni che realizzano la stessa cosa, ma usando Applicative contro Monad definizioni.

Alcuni esempi sono:

  • (<*>) vs ap
  • pure vs return
  • (*>) vs (>>)
  • traverse vs mapM
  • sequenceA vs sequence
  • liftA vs liftM
  • liftA2 vs liftM2
  • ecc.

E per Alternative rispetto a MonadPlus :

  • empty vs mzero
  • (<|>) vs mplus

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.

    
posta zbw 29.06.2017 - 20:03
fonte

1 risposta

10

Per efficienza e generalità, in genere dovresti preferire gli operatori più generici. Quindi dovresti usare Applicative operatori preferenziali a Monad e Alternative a MonadPlus .

La differenza di efficienza spesso non è significativa, quindi se hai già un vincolo di Monad / MonadPlus , dovresti sentirti libero di utilizzare qualsiasi operatore pertinente per produrre il codice più bello.

L'estensione ApplicativeDo ti consente di ottenere il vantaggio di do -notazione senza un requisito Monad . Raccomando il documento Haxl per un esempio non banale in cui vi è una differenza di prestazioni abbastanza significativa tra Applicative e Monad (ed era un motivatore per implementare la notazione ApplicativeDo ).

    
risposta data 29.06.2017 - 21:34
fonte

Leggi altre domande sui tag