Haskell/Soluções: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 209:
</source>
 
== [[Haskell/Casamento de padrões, if e let|Casamento de padrões, if e let]] ==
 
{{Exercício|1=
Por que as expressões dentro de ''then'' e ''else'' contidas num mesmo if devem possuir o mesmo tipo?}}
Numa expressão ''if'', é dentro de ''then'' e ''else'' que são definidos os possíveis resultados finais. Em Haskell, toda expressão deve ter um tipo fixo, imutável. Como não sabemos qual caso será avaliado, se ''then'' ou se ''else'', ambos devem possuir o mesmo tipo final para satisfazer o prerequisito de imutabilidade de tipos de Haskell.
 
{{Exercício|1=
Reescreva a função <code>pts</code> usando guardas.}}
 
<source lang="haskell">
pts :: Int -> Int
pts x
| x == 1 = 10
| x == 2 = 6
| x == 3 = 4
| x == 4 = 3
| x == 5 = 2
| x == 6 = 1
| otherwise = 0
</source>
 
{{Exercício|1=
A versão de casamento de padrões de <code>pts</code> e esta última versão mista são ligeiramente diferentes. Você consegue ver a diferença? Conseguiria reescrever a versão mista para que as duas retornem os mesmos resultados sempre? Dica: compare a definição matemática e a implementação em Haskell.
}}
 
A diferença acontece quando o argumento é menor que <code>1</code>. Na versão de casamento de padrões, se o argumento for <code>-1</code>, o padrão casado será o último (<code>_</code>) e o resultado seria <code>0</code>. Na versão mista, entraríamos no padrão com guardas, a primeira guarda seria verdadeira, e o resultado final seria <code>7 - (-1)</code> que é <code>8</code>, o que é um resultado errado.
 
Uma possível solução seria escrever:
<source lang="haskell">
pts :: Int -> Int
pts 1 = 10
pts 2 = 6
pts x
| x < 1 || x > 7 = 0
| otherwise = 7 - x
</source>
 
{{Exercício|1=
Escreva uma função <code>quarto</code> que extraia o quarto elemento de uma 10-upla.
}}
 
<source lang="haskell">
quarto :: (a,b,c,d,e,f,g,h,i,j) -> d
quarto (_,_,_,x,_,_,_,_,_,_) = x
</source>
 
= Introdutório =