Question

Une petite question qui a été mise sur écoute-moi ces derniers temps. Est-ce que Haskell effectuer tous les tests d'équivalence dans une fonction qui renvoie un booléen, même si l'on retourne une valeur fausse?

Par exemple

f a b = ((a+b) == 2) && ((a*b) == 2)

Si le premier test retourne false, sera-t effectuer le second test après la &&? Ou est Haskell assez paresseux pour ne pas le faire et passer à autre chose?

Était-ce utile?

La solution

Doit être court-circuité comme d'autres langues. Il est défini comme celui-ci dans le Prélude:

(&&)                    :: Bool -> Bool -> Bool
True  && x              =  x
False && _              =  False

Donc, si le premier paramètre est False le 2ème ne doit jamais être évaluée.

Autres conseils

Comme Martin a dit, les langues avec l'évaluation paresseuse jamais évaluer tout ce qui est la valeur est pas immédiatement nécessaire. Dans un langage paresseux comme Haskell, vous obtenez un court-circuit gratuitement. Dans la plupart des langues, le || et && et opérateurs similaires doivent être construits spécialement dans la langue afin qu'ils l'évaluation de court-circuit. Cependant, Haskell, évaluation paresseuse rend cela inutile. Vous pouvez définir une fonction qui court-circuit vous-même même:

scircuit fb sb = if fb then fb else sb

Cette fonction se comportera comme la logique « ou » opérateur. Voici comment || est défini dans Haskell:

True  || _ = True
False || x = x

Alors, pour vous donner une réponse précise à votre question, non. Si le côté gauche du || est vrai, le côté droit est jamais évaluée. Vous pouvez mettre deux et deux pour les autres opérateurs que « court-circuit ».

évaluation paresseuse signifie que rien n'est évalué jusqu'à ce qu'il soit vraiment nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top