Un court-circuit (&&) dans Haskell
-
21-09-2019 - |
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?
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.