C'è molto da dire in risposta alla tua domanda, tuttavia, dal momento che hai chiesto, offrirò questa "regola generale".
Se si utilizza do
-notazione e i valori generati [1] non vengono utilizzati nelle espressioni che si stanno sequenziando [2], tale codice può essere trasformato in uno stile Applicativo. Allo stesso modo, se si utilizza uno o più valori generati in un'espressione sequenziata, è necessario utilizzare Monad
e Applicative
non abbastanza forte da ottenere lo stesso codice.
Per esempio, esaminiamo il seguente codice:
do a <- e1
b <- e2
c <- e3
return (f a b c)
vediamo che in nessuna delle espressioni a destra del <-
fare qualsiasi dei valori generati (a
, b
, c
) appaiono. Pertanto, possiamo trasformarlo in usando il codice Applicativo.Qui è una possibile trasformazione:
f <$> e1 <*> e2 <*> e3
e altro:
liftA3 f e1 e2 e3
D'altra parte, prendere questo pezzo di codice per esempio:
do a <- e1
b <- e2 a
c <- e3
return (f b c)
Questo codice non può utilizzare Applicative
[3 ] perché il valore generato a
viene utilizzato successivamente in un'espressione nella comprensione. Questo deve utilizzare Monad
per ottenere il suo risultato - tentare di inserirlo in Applicative
per capire perché.
Ci sono alcuni dettagli ulteriori interessanti e utili su questo argomento, però, ho solo lo scopo di darvi questa regola generale per cui è possibile scremare sopra un -comprehension do
e determinare abbastanza rapidamente se può essere preso in considerazione in Applicative
codice di stile .
[1] Quelle che appaiono a sinistra di <-
.
[2] Espressioni visualizzate a destra di <-
.
[3] in senso stretto, alcune parti di esso potrebbero, scendendo e2 a
.
Questo è l'unico posto che ho visto dove viene spiegata la differenza tra 'Monad' e' Applicative' (in termini di cosa è possibile esprimere con ciascuno). Ottimo lavoro! Possiamo chiamare "ifte" con le funzioni applicative: "z = ifte <$> ..."? –
"ifte" è già una funzione monadica, quindi non c'è molto altro da sollevare ancora una volta. –
È possibile scrivere "ifte" <$> (pure True) "come" ifte "True" - "puro" è raramente necessario in combinazione con "<$>" e "<*>" (se del tutto). – Martijn