So che la domanda è stata posta there ma non posso credere che non ci sia una risposta diretta.Cortocircuito AND dentro IO Monad
ho capito che non è buono per nascondere effetto collaterale all'interno di una (& &), ma nel mio caso l'effetto collaterale sono solo controllando qualcosa nel mondo outstide (esistenza di un file, controllare il tempo di modifica ecc, chiedere all'utente un sì/no quistione).
Quindi, qual è il modo haskell per qualcosa di simile, in modo che cond2 non venga eseguito se cond1 è falso.
cond1, cond2 :: IO bool
main = do
cond <- liftM2 (&&) con1 con2
if cond
then result1
else result2
mi aspettavo qualcosa di simile cond <- all [con1, con2]
o equivalente, ma non riesco a trovare nulla.
Aggiornamento
Posso vedere un sacco di soluzione manuale. Sono ancora confuso dal fatto che questa funzione non esista da qualche parte. Un vantaggio della valutazione di lazzy è che non solo cortocircuito per codifica codificata &&
come in C. È davvero strano che quando in imperativo nella modalità, Haskell non riesca nemmeno a cortocircuitare &&
. Sebbene, tutte le soluzioni utilizzino in qualche modo e se cortocircuitare la valutazione. Non c'è un modo per creare un generico lazzy liftM2
?
monad-loops
senza l'utilizzo di combinatori speciali: 'andm [] = TRUE tornare e poi' andm (x: XS) = do b <- x; se b allora eM xs else restituiscono False' – ErikRCome ho detto di seguito, 'andM' è definito nella libreria monad-loops, dove ci si aspetta di trovare cose come questa http://hackage.haskell.org/package/monad-loops -0.4.2.1/docs/Control-Monad-Loops.html # v: andM – Michael
@Arthur non ha visto l'aggiornamento. – mb14