Corto circuito (&&) in Haskell
-
21-09-2019 - |
Domanda
Una domanda veloce che è stato bugging me ultimamente. Ha Haskell eseguire tutti i test di equivalenza in una funzione che restituisce un valore booleano, anche se si restituisce un valore falso?
Ad esempio
f a b = ((a+b) == 2) && ((a*b) == 2)
Se il primo test restituisce false, sarà eseguire il secondo test dopo la &&
? O è Haskell abbastanza pigro per non farlo e andare avanti?
Soluzione
Dovrebbe essere in corto circuito proprio come le altre lingue. E 'definita come questo nel Preludio:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
Quindi, se il primo parametro è False il 2 ° non deve essere valutato.
Altri suggerimenti
Come Martin ha detto, le lingue con valutazione pigra mai valutare tutto ciò che il suo valore non è immediatamente necessaria. In un linguaggio pigri come Haskell, si ottiene corto circuito gratuitamente. Nella maggior parte delle lingue, il || e && e operatori simili devono essere costruiti appositamente nel linguaggio per consentire loro di valutazione di corto circuito. Tuttavia, in Haskell, valutazione pigra rende superfluo. Si potrebbe definire una funzione che cortocircuiti te anche:
scircuit fb sb = if fb then fb else sb
Questa funzione si comporterà esattamente come l'operatore logico 'o'. Ecco come || è definito in Haskell:
True || _ = True
False || x = x
Quindi, per darvi la risposta specifica alla tua domanda, no. Se il lato sinistro della || È vero, il lato destro non viene mai valutata. Si può mettere insieme due più due per gli altri operatori che 'corto circuito'.
di valutazione pigro significa che nulla è valutato fino a che non è realmente necessario.