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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top