Ir para o conteúdo

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