Haskell/Tipos básicos: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
m Neste caso, o singular "Trata-se de" é a forma correta
Linha 200:
== Anotações de tipo em arquivos de código ==
 
Agora que já entendemos um pouco o que são os tipos e no que eles podem nos ajudar, vejamos como fazer este tipo de anotação num código fonte de um programa que você está escrevendo. Considere a função <code>xor</code> que definimos antes. Se quisermos definádefini-la dentro de um arquivo, e quisermos anotar seu tipostipo, basta escrever:
 
<source lang=haskell>
Linha 209:
Só isso. Para maior clareza, é comum que a anotação apareça imediatamente antes da definição, então é recomendável que você se atenha a esta convenção.
 
Além de faciliarfacilitar que humanos entendam o funcionamento da função, as anotações de tipo tão são fundamentais para que o compilador as interprete corretamente, como veremos a seguir.
 
=== Inferindo tipos ===
Como dissemos antes, funções possuem tipo. É importante destacar que elas ''sempre'' possuem tipo. Mas como é que escrevemos as funções do capítulo anterior sem nenhum assinatura? Isso é possível porque o compilador consigueconsegue ''inferir'' o tipo de uma função baseando-se nas operações que ela executa. Vejamos o seguinte caso:
 
<source lang=haskell>
Linha 251:
* '''Documentação:''' como já vimos, anotações de tipo ajudam a entender o que uma função faz. ''Documentar'' um programa, é justamente descrever o que suas partes fazem e como funcionam. Claro que comentários ajudam, mas em Haskell as anotações de tipo são tão importantes quanto comentários.
 
* '''''Debugging'':''' muitos ''bugs'', ou erros encontrados nos programas são causados quando se uma função de forma errada. As anotações de tipo ajudam você e o compilador a descobrir se uma função está sendo usada de forma correta, verificando os tipos das muitas entradas e saídas que seu programa pode gerar. Quando declaramos as anotações e ocorre algum erro de incompatibilidade de tipos, o compilador sempre mostra uma mensagem dizendo onde está o problema. Se os tipos forem omitidos, o compilador pode inferíinferi-las de uma forma que funcionem num parte, mas que causem outros erros inesperados durante a execução, ou outro erro de compilação em outra parte.
 
Vejamos um exemplo simples de ''debugging''. Tente o seguinte no GHCi:
Linha 266:
}}
 
AcabmosAcabamos de introduzir a função <code>(++)</code>, que nada mais faz que concatenar os dois Strings: <code>"ola"</code> e <code>" mundo"</code>. Se por um erro de digitação você escrever <tt>+</tt> em vez de <tt>++</tt>, a mensagem de erro acima apareceria. De forma resumida, ela nos diz que <code>(+)</code> só está definida para dados <code>Num</code>, e que estamos tentando aplicá-la a dados do tipo <code>[Char]</code>, ou String, como já vimos.
 
É importante dizer que a checagem de tipos não previne completamente a ocorrência de erros. Na verdade, ainda podemos escrever uma função de uma forma que não funcione como a desejada. Mas mesmo aí, pensar nas operações que podemos ou não fazer como cada tipo de dado, nos ajuda guiar nossa lógica programação.