VictorCacciari 42 Denunciar post Postado Janeiro 31, 2010 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