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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top