Apelidos
A palavra reservada type
permite que definamos apelidos para tipos no Haskell, tornando o código mais legível.
Por exemplo, podemos definir um tipo Inteiro
similar ao tipo Int
e funções associadas ao tipo.
type Inteiro = Int
somaInteiros :: Inteiro -> Inteiro -> Inteiro
somaInteiros a b = a + b
O uso da função é como esperado.
*Main> somaInteiros 1 2
3
*Main> somaInteiros (1::Inteiro) (2::Inteiro)
3
Além de apelidos para tipos simples, type
permite que definamos tipos mais complexos.
Tuplas como tipos
Usando type
podemos definir que Pessoa é o tipo definido na seção anterior, i.e., uma tupla dos campos nome, telefone, CPF e endereço.
type Pessoa = (String, String, String, String)
fazPessoa :: String -> String -> String -> String -> Pessoa -- (1) Definição da função.
fazPessoa nome telefone cpf endereço = (nome, telefone, cpf, endereço)
pegaNome :: Pessoa -> String
pegaNome (nome, _, _, _) = nome
pegaTelefone :: Pessoa -> String
pegaTelefone (_, telefone, _, _) = telefone
pegaCPF :: Pessoa -> String
pegaCPF (_, _, c, _) = c
pegaEndereço :: Pessoa -> String
pegaEndereço (_, _, _, e) = e
trocaTelefone :: Pessoa -> String-> Pessoa
trocaTelefone p novoTelefone = fazPessoa (pegaNome p) novoTelefone (pegaCPF p) (pegaEndereço p)
Se perguntarmos ao Haskell qual o tipo da tupla gerada pela função fazPessoa
, ele responderá Pessoa
.
> :t fazPessoa
fazPessoa :: String -> String -> String -> String -> Pessoa
> p = fazPessoa "Jose" "Tel" "CPF" "End"
> :t p
p :: Pessoa
Podemos ir além e definir tipos usando outros tipos estruturados. Por exemplo:
type Nome = (String, String, String)
type Telefone = (String, String)
type CPF = String
type Endereço = (String, String, String)
type Pessoa = (Nome, Telefone, CPF, Endereço)
fazPessoa :: Nome -> Telefone -> CPF -> Endereço -> Pessoa -- (1) Definição da função.
fazPessoa nome telefone cpf endereço = (nome, telefone, cpf, endereço)
pegaNome :: Pessoa -> Nome
pegaNome (nome, _, _, _) = nome
pegaTelefone :: Pessoa -> Telefone
pegaTelefone (_, telefone, _, _) = telefone
trocaTelefone :: Pessoa -> Telefone -> Pessoa
trocaTelefone (n, _t, c, e) novoTelefone = (n, novoTelefone, c, e)
Neste caso
> p = fazPessoa ("José","da","Silva") ("ddd","numero") "CPF" ("Rua da Couves","143","Brasil")
> p
(("Jos\233","da","Silva"),("ddd","numero"),"CPF",("Rua da Couves","143","Brasil"))
> :t p
p :: Pessoa
> n = pegaNome p
> n
("Jos\233","da","Silva")
> :t n
n :: Nome