Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

VictorCacciari

[Haskell Aula 05] Tipos de dados indutivos

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.