Tipos Básicos e seus Operadores
Como toda linguagem de programação, Haskell tem vários tipos pré-definidos para representar números, valores booleanos, e (sequências de) caracteres. Algo a se notar é que os nomes dos tipos são iniciados com letras maiúsculas, diferentemente dos nomes de funções e variáveis.
Números
Os tipos básicos para a representação de números em Haskell são apresentados na seguinte tabela.
Observe que o tipo Integer ter precisão arbitrária, ou seja, pode ser usado para representar números com "qualquer" quantidade de dígitos, diferentemente de Int, que só consegue representar números em uma faixa específica (64 bits).
Tipos numéricos
| Tipo | Descrição | Valores |
|---|---|---|
Int |
Inteiro de precisão finita | 4, -14, 2147483647 |
Integer |
Inteiro de precisão arbitrária | 30414093201713378043612608166064768844377641568960512000000000000 |
Float |
Ponto flutuante de precisão simples | 25.132742 |
Double |
Ponto flutuante de precisão dupla | 25.132741228718345 |
Operadores
Diversos operadores são definidos para os tipos numéricos básicos, como mostra a tabela a seguir.
| Operador | Operação | Exemplo |
|---|---|---|
+ |
Adição | 1 + 1 ⭆ 2 |
- |
Subtração | 1 - 1 ⭆ 0 |
* |
Multiplicação | 1 * 1 ⭆ 1 |
/ |
Divisão | 1 / 1 ⭆ 1 |
^ |
Exponenciação | 2^4 ⭆ 16 |
- |
Inversão de sinal2 | - (-10) ⭆ 10 |
negate |
Inversão de sinal2 | negate (-10) ⭆ 10 |
quot |
Divisão inteira, truncado para o 0, i.e., quot a b é igual a \(\lfloor\frac{a}{b}\rfloor\) se \(a>0\) e \(\lceil\frac{a}{b}\rceil\) se \(a<0\) |
quot 8 3 ⭆ 2 e quot (-8) 3 ⭆ -2 |
rem |
Resto da divisão inteira, tal que (quot x y)*y + (rem x y) ⭆ x |
rem 8 3 ⭆ 2 e rem (-8) 3 ⭆ -2 |
div |
Divisão inteira, truncado para baixo, i.e., div a b é igual a \(\lfloor\frac{a}{b}\rfloor\) |
div 8 3 ⭆ 2 e div (-8) 3 ⭆ -3 |
mod |
Módulo do inteiro, tal que (div x y)*y + (mod x y) ⭆ x |
mod (-8) 3 ⭆ 1 e mod (8) 3 ⭆ 2 |
Infixo X Prefixo
Observe que alguns destes operadores são naturalmente infixos, e.g., +, e outros, prefixos, e.g., rem.1
Contudo, ambos podem ser usados da outra forma, como mostrado nos seguintes exemplos, em que os operadores infixos são envelopados em por parênteses e os pré-fixos em aspas invertidas simples.
10 + 20
(+) 10 20
quot 10 3
10 `quot` 3
Tipos para números
Caso você queira ou precise, pode especificar um tipo para um número, por exemplo, 20 :: Int ou 20 :: Double.
Exercícios
- Usar todos os operadores
- Evidenciar diferenças entrem quot/rem e div/mod.
Booleanos
Para representação de valores lógicos, Haskell define o tipo Bool.
| Tipo | Descrição | Valores |
|---|---|---|
Bool |
Booleano | True ou False |
Para este tipo, temos os seguintes operadores.
| Operador | Operação |
|---|---|
&& |
E lógico |
|| |
OU lógico |
not |
Negação |
== |
Igualdade |
/= |
Diferença |
Caracteres
Finalmente, para a representação de caracteres individuais, Haskell usa o tipo Char, e para sequências de caracteres, usa o tipo String.
Exemplos dos dois tipos são apresentados na tabela a seguir.
| Tipo | Descrição | Valores |
|---|---|---|
Char |
Caractere | '1'; 'a'; 'B' |
String |
Sequência de caracteres | "Eu"; "Hello"; "Zabumba" |
O tipo String é, na verdade, apenas um "apelido" para o tipo lista de caracteres e, assim sendo, voltaremos a falar de String quando estudarmos listas, mais adiante.
Haskell trabalha com caracteres Unicode, que incluem símbolos e letras em diferentes línguas, números, sinais de pontuação, separadores e outros caracteres especiais, como emojis e caracteres de controle. A seguir, algumas funções de manipulação de caracteres.3
| Função | Descrição | Exemplo |
|---|---|---|
isSpace |
Testa se é um espaço em branco ' ') ou um dos seguintes caractere de controle \t, \n, \r, \f ou \v |
isSpace '\t' ⭆ True e isSpace ' ' ⭆ True |
isControl |
Testa se é um caracter de controle | isControl '\t' ⭆ True |
isLetter |
Testa se é uma letra | isLetter 'A' ⭆ True e isLetter '\t' ⭆ False |
isDigit |
Testa se é um dígito | isDigit 'A' ⭆ False e isDigit '3' ⭆ True |
isLower |
Testa se é uma letra minúscula | isLower 'a' ⭆ True e isLower '\t' ⭆ False |
isUpper |
Testa se é uma letra maiúscula | isUpper 'A' ⭆ True e isUpper '\t' ⭆ False |
toLower |
Transforma uma letra em minúscula | toLower 'a' ⭆ 'a' e toLower 'A' ⭆ 'a' |
toUpper |
Transforma uma letra em maiúscula | toUpper 'A' ⭆ 'A' e toUpper 'a' ⭆ 'A' |