Recordar a função factorial :
fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact (n-1)
> fact 5
120
> fact 20
2432902008176640000
> fact (-1)
*** **Exception**: **stack overflow {-Porque a computação não termina e enche a stack-}**
Usando a função com uma guarda (condição) :
fact :: Integer -> Integer
fact 0 = 1
fact n **|** **n > 0** = n * fact (n-1)
> fact (-1)
*** **Exception**: Non-exhaustive patterns in function fact
{-A guarda é uma expressão Booleana-}
{-A equação só pode ser usada se a condição for verdadeira-}
Uma definição alternativa :
fact :: Integer -> Integer
fact 0 = 1
fact n **|** n > 0 = n * fact (n-1)
**|** otherwise = error "Não está definida."
{-Aqui temos 2 equações com guardas-}
{-A guarda "*otherwise*" corresponde a True-}
{-A função "*error :: String -> a*" do Prelude, permite alterar a mensagem de erro-}
> fact (**-1**)
*** **Exception**: Não está definida.
Diferença entre "if...then...else..." e guarda :
sinal :: Int -> Int
sinal x = if x<0 then -1
else if x==0 then 0
else 1
sinal x **|** x<0 = -1
**|** x==0 = 0
**|** otherwise = 1
O uso de equações guardadas é também uma forma de contornar o facto de as expressões condicionais em Haskell terem obrigatoriamente o ramo else.