Curto -circuito (&&) em Haskell
-
21-09-2019 - |
Pergunta
Uma pergunta rápida que está me incomodando ultimamente. Haskell realiza todo o teste de equivalência em uma função que retorna um booleano, mesmo que se retorne um valor falso?
Por exemplo
f a b = ((a+b) == 2) && ((a*b) == 2)
Se o primeiro teste retornar falso, ele realizará o segundo teste após o &&
? Ou Haskell é preguiçoso o suficiente para não fazer isso e seguir em frente?
Solução
Deve ser curto como outros idiomas. Está definido assim no prelúdio:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
Portanto, se o primeiro parâmetro for falso, o segundo nunca precisará ser avaliado.
Outras dicas
Como Martin disse, os idiomas com avaliação preguiçosa nunca avaliam nada que o valor não seja necessário imediatamente. Em uma linguagem preguiçosa como Haskell, você recebe curto -circuito gratuitamente. Na maioria das línguas, o || e && e operadores similares devem ser construídos especialmente no idioma para que eles avaliem o curto -circuito. No entanto, em Haskell, a avaliação preguiçosa torna isso desnecessário. Você pode definir uma função que se curva até mesmo:
scircuit fb sb = if fb then fb else sb
Esta função se comportará exatamente como o operador lógico 'ou'. Aqui está como || é definido em Haskell:
True || _ = True
False || x = x
Então, para dar a você a resposta específica à sua pergunta, não. Se o lado esquerdo do || é verdadeiro, o lado direito nunca é avaliado. Você pode montar dois e dois para os outros operadores que 'curto -circuito'.
Avaliação preguiçosa significa que nada é avaliado até que seja realmente necessário.