Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Haskell material nota de aula, Notas de aula de Programação Funcional

Aula 8° Listas infinitas - Programação Funcional

Tipologia: Notas de aula

2020

Compartilhado em 18/04/2020

delfina-fineza
delfina-fineza 🇦🇴

1 documento

1 / 27

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Programação Funcional
13aAula Definição de tipos
Pedro Vasconcelos
DCC/FCUP
2014
Pedro Vasconcelos DCC/FCUP Programação Funcional 13aAula Definição de tipos
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b

Pré-visualização parcial do texto

Baixe Haskell material nota de aula e outras Notas de aula em PDF para Programação Funcional, somente na Docsity!

Programação Funcional

13 a^ Aula — Definição de tipos

Pedro Vasconcelos DCC/FCUP

Declarações de sinónimos

Podemos dar um nome novo a um tipo existente usando uma declaração de sinónimo.

Exemplo (do prelúdio-padrão):

type String = [Char]

Declarações de sinónimos (cont.)

As declarações de sinónimos também podem ter parâmetros.

Exemplo: associações entre chaves e valores.

type Assoc ch v = [(ch,v)] -- tabela de associações

idades :: Assoc String Int idades = [("Pedro", 41), ("João", 27), ("Maria", 19)]

emails :: Assoc String String emails = [("Pedro", "[email protected]"), ("João", "[email protected]")]

Declarações de sinónimos (cont.)

Os sinónimos podem ser usados noutras definições:

type Pos = (Int,Int) type Cells = [Pos] -- OK

Mas não podem ser usados recursivamente:

type List a = (a,List a) -- ERRO

Declarações de novos tipos (cont.)

A declaração data enumera as alternativas separadas por barras verticais. Cada alternativa deve ter um construtor (ex.: True e False). O nome dos tipos e construtores deve ser começar por uma letra maiúscula. Cada construtor só pode ser usado num único tipo.

Declarações de novos tipos (cont.)

Podemos definir funções sobre novos tipos usando padrões.

Exemplo: um tipo para as direções ortogonais (esquerda, direita, cima, baixo).

data Dir = Esq | Dir | Cima | Baixo

Vamos definir algumas funções...

Construtores com parâmetros

Os construtores podem também ter parâmetros.

Exemplo:

data Figura = Circ Float -- raio | Rect Float Float -- largura, altura

quadrado :: Float -> Figura quadrado h = Rect h h

area :: Figura -> Float area (Circ r) = pir^ area (Rect w h) = wh

Construtores com parâmetros (cont.)

Os construtores podem ter diferentes números de parâmetros Os parâmetros podem ser de tipos diferentes Podemos usar os construtores de duas formas: como funções para construir um valor Circ :: Float -> Figura Rect :: Float -> Float -> Figura em padrões no lado esquerdo de equações area (Circ r) = pir^ area (Rect w h) = wh

Igualdade e conversão em texto (cont.)

Podemos definir igualdade e conversão para texto automaticamente usando “deriving”:

data Figura = Circ Float | Rect Float Float deriving (Eq, Show) Exemplo de uso:

> Circ 2 Circ 2.

> Rect 2 1 == Rect 1 2 False

A igualdade é sintática: dois valores são iguais se e só se têm o mesmo construtor e argumentos.

Novos tipos com parâmetros

As declarações de novos tipos também podem ter parâmetros.

Exemplo:

data Maybe a = Nothing | Just a -- do prelúdio-padrão

safediv :: Int -> Int -> Maybe Int safediv _ 0 = Nothing safediv n m = Just (ndivm)

safehead :: [a] -> Maybe a safehead [] = Nothing safehead xs = Just (head xs)

Tipos recursivos (cont.)

Alguns valores de Nat:

Zero -- zero Suc Zero -- um Suc (Suc Zero) -- dois Suc (Suc (Suc Zero)) -- três .. .

Em geral: n é obtido aplicado n vezes Succ a Zero.

Suc (Suc (... (Suc Zero)...)) -- n aplicações

Tipos recursivos (cont.)

Usando recursão, podemos definir funções que convertem entre inteiros e naturais: int2nat :: Int -> Nat int2nat 0 = Zero int2nat n | n>0 = Suc (int2nat (n-1))

nat2int :: Nat -> Int nat2int Zero = 0 nat2int (Suc n)= 1+nat2int n

Tipos recursivos (cont.)

Em alternativa, podemos definir a soma usando recursão sobre naturais. add :: Nat -> Nat -> Nat add Zero m = m add (Suc n) m = Suc (add n m)

Estas duas equações traduzem as seguintes igualdades algébricas:

0 + m = m ( 1 + n) + m = 1 + (n + m)

Tipos recursivos (cont.)

Exemplo:

add (Suc (Suc Zero)) (Suc Zero)

Suc (add (Suc Zero) (Suc Zero))

Suc (Suc (add Zero (Suc Zero)))

Suc (Suc (Suc Zero))