Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Aula 05 - Tipos de dados
Finalmente ja estamos começando a estudar coisas interessantes em Haskell.
Em Haskell, existe uma forma de definir outros nomes para tipos (como o typedef do c)
Por exemplo:
type String = [Char]
Declara 'String' como sendo uma lista de 'Char'.
ATENÇÃO: Não sei se ja notaram, mas nomes com letras maiúsculas definem construtores de tipos,
A seguinte expressão não compilará:
type string = [Char]
Pois estamos declarando um novo tipo e o nome desse tipo deve começar com uma letra maiúscula.
Além de podermos definir outros nomes para tipos de dados, podemos definir novos tipos
Por exemplo:
data DiaSemana = Seg | Ter | Qua | Qui | --- | Sab | Dom
E, por enumeração, definimos os dias da semana... Por exemplo, imaginemos uma função 'fds' que dado um dia da semana diz-nos se é ou não fim de semana
fds :: DiaSemana -> Bool
fds Sab = True
fds Dom = True
fds _ = False
Vamos supor que estamos programando um software para cadastrar usuários num banco de dados médico.
Temos que definir diversos 'tipos' para isso, por exemplo:
type Nome = String
type Data = (Int, Int, Int) // dia / mes / ano
type Nascimento = Data
data Sexo = Homem | Mulher
data TipoSangue = ABneg | Bneg | Aneg | Oneg | ABpos | Bpos | Apos | Opos
type Registro = [(Nome, Nascimento, Sexo, TipoSangue)]
Nos casos apresentados, é muito simples definir os tipos por enumeração...
Mas e, por exemplo, para definir o conjunto dos números naturais??
Não da pra enumerarmos todos os números naturais...
Por impossibilidades como essa, Haskell suporta tipos indutivos:
data Natural = Zero | Succ Natural
Um número natural é zero, ou é sucessor de outro número natural.
Por exemplo, 3 = Succ (Succ (Succ Zero))
Nota: Cada 'ramo' recebe um nome começado por maiúscula, por se tratar de um tipo, e pode receber parametros.
No exemplo anterior, 'Succ' recebe um parametro que por sua vez é do tipo Natural.
Vamos escrever algumas funções para trabalhar com 'Natural'
n2i :: Natural -> Int
n2i Zero = 0
n21 (Succ a) = 1 + (n2i a)
i2n :: Int -> Natural
i2n 0 = Zero
i2n (n+1) = Succ (i2n n)
soma :: Natural -> Natural -> Natural
soma n Zero = n
soma n (Succ a) = Succ (soma n a)
E podemos ser ainda mais abstratos nessas definições...
Para definir uma árvore binária sobre números inteiros, fariamos:
// esq dir
data ArvBinInt = Vazia | Nodo Int ArvBinInt ArvBinInt
Mas, e para definir uma árvore binária sobre floats??
E sobre strings?
Não é preciso escrever uma definição para cada, dizemos:
// esq dir
data ArvBin a = Vazia | Nodo a (ArvBin a) (ArvBin a)
A essa definição funciona para qualquer tipo...Se chamarmos: 'ArvBin Int' será uma árvore de inteiros, se chamarmos 'ArvBin Bool' será uma árvore de booleanos, e assim por diante.
Bom, por hoje é só.
Até a próxima.