Escolar Documentos
Profissional Documentos
Cultura Documentos
1
99 questions - Questão 1
2
99 questions - Questão 1
myLast :: ?? -> ??
3
99 questions - Questão 1
4
99 questions - Questão 1
5
99 questions - Questão 1
6
99 questions - Questão 1
7
99 questions - Questão 2
E o penúltimo elemento?
8
99 questions - Questão 2
E o penúltimo elemento?
9
Project Euler 04
Um número palíndrome é aquele que pode ser lido nas duas direções:
12321
10
Project Euler 04
Basicamente queremos:
euler4 :: Integer
euler4 = maior
$ [x*y | x <- tresDigitos, y <- tresDigitos
ehPalindrome (x*y)]
11
Project Euler 04
tresDigitos :: [Integer]
tresDigitos = ??
12
Project Euler 04
tresDigitos :: [Integer]
tresDigitos = [100..999]
13
Project Euler 04
14
Project Euler 04
15
Project Euler 04
16
Project Euler 04
17
Project Euler 04
18
Project Euler 04
19
Project Euler 04
20
Project Euler 04
21
Project Euler 04
22
Project Euler 04
23
Project Euler 04
24
Project Euler 04
25
Project Euler 04
26
Project Euler 04
27
Project Euler 04
28
Project Euler 04
29
Project Euler 04
30
Project Euler 04
31
Projecto Euler 04
32
Funções de alta ordem
33
Funções de alta ordem
34
Funções com funções
35
Funções com funções
36
Aplicação parcial
soma x y z = x + y + z
soma2 x y = soma 2
soma23 x = soma2 3
> soma2 1 2
5
> soma23 1
6
37
Funções com funções
38
Funções de alta ordem para listas
[f x | x <- xs]
39
Map
Uma função que transforma uma lista do tipo a para o tipo b utilizando
uma função f :: a -> b.
40
Map
Com isso temos uma visão mais clara das transformações feitas em
listas:
41
Observações sobre o map
42
Filter
43
Filter
44
Filter
45
Filter
46
Map e Filter
47
Operador pipe
48
Outras funções de alta ordem
49
Project Euler 04
euler4 :: Integer
euler4 = maior
$ [x*y | x <- tresDigitos, y <- tresDigitos
ehPalindrome (x*y)]
50
Project Euler 04
euler4 :: Integer
euler4 = maior
$ filter ehPalindrome
$ map (\(x,y) -> x*y)
$ cartesiano tresDigitos tresDigitos
51
Folding
52
Função foldr
sum [] = 0
sum (x:xs) = x + sum xs
product [] = 1
product (x:xs) = x * product xs
length [] = 0
length (_:xs) = 1 + length xs
53
Função foldr
f [] = v
f (x:xs) = g x (f xs)
54
Função foldr
55
Função foldr
56
Função foldr
57
Função foldr
58
Função foldr
Ou seja:
se torna:
1 + (2 + (3 + 0))
59
Função foldr
60
Exercício
61
Resposta
62
Função length
63
Função length
Para a lista:
1 : (2 : (3 : []))
devemos obter:
1 + (1 + (1 + 0))
64
Função length
Da assinatura de foldr:
65
Função length
66
Exercício
67
Resposta
1 : (2 : (3 : []))
=> (([] ++ [3]) ++ [2]) ++ [1]
snoc x xs = xs ++ [x]
reverse = foldr snoc []
68
Função foldl
69
Função foldl
1 : (2 : (3 : []))
=> (([] : 1) : 2) : 3
=> ((0 + 1) + 2) + 3
70
Função foldl
71
Função length
72
Função length
73
Função reverse
E a função reverse?
74
Resposta
1 : (2 : (3 : []))
=> (([] f 3) f 2) f 1
f xs x = ???
reverse = foldl f []
75
Resposta
1 : (2 : (3 : []))
=> (([] f 3) f 2) f 1
f xs x = x:xs
reverse = foldl f []
76
foldr vs foldl
77
Composição de funções
78
Composição de funções
79
Composição de funções
Dada uma função que mapeia do tipo b para o tipo c, e outra que
mapeia do tipo a para o tipo b, gere uma função que mapeie do tipo a
para o tipo c.
80
Propriedades da composição
(f . g) . h == f . (g . h)
81
Propriedades da composição
f . id = id . f = f
82
Propriedades da composição
83
Definindo novos tipos
84
Novos tipos de dados
85
Declaração de tipo
86
Declaração de tipo
87
Declaração de tipo
88
Declaração de tipo
89
Declaração de tipo
90
Exercício
91
Resposta
paraCima :: Trans
paraCima (x,y) = (x,y+1)
92
Declaração de tipo
93
Tipos de Dados Algébricos
94
Tipos de Dados Algébricos
95
Tipos Soma
Tipo soma:
96
Exemplo
97
Exemplo
98
Exemplo
E a função caminhar:
99
Tipos Produto
Tipo produto:
100
Tipos Produto
101
Tipos Produto
102
Tipos Produto
103
Tipos Produto
> :t Circulo
Circulo :: Ponto -> Double -> Forma
> :t Retangulo
Retangulo :: Ponto -> Double -> Double -> Forma
104
Tipos parametrizados
A declaração indica que um tipo Maybe a pode não ser nada ou pode
ser apenas o valor de um tipo a.
105
Maybe
Esse tipo pode ser utilizado para ter um melhor controle sobre erros e
exceções:
106
Maybe
107
Either
Esse tipo permite que uma função retorne dois tipos diferentes,
dependendo da situação.
108
Either
> safeDiv' 2 2
1
> safeDiv' 2 0
”divisão por 0”
109
Exercício
110
Resposta
111
Newtype
112
Tipos Recursivos
113
Árvore Binária
114
Árvore Binária
t :: Tree Int
t = Node (Node (Leaf 1) 3 (Leaf 4)) 5
(Node (Leaf 6) 7 (Leaf 9))
115
Árvore Binária
> t `contem` 5
True
> t `contem` 0
False
116
Exercício
117
Resposta
118
Classes de Tipo
119
Clases de Tipo
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
120
Clases de Tipo
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
121
Clases de Tipo
Além disso, ela já define uma definição padrão da função (/=), então
basta definir (==).
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
122
Instâncias da Classe
123
Instâncias da Classe
124
Classes de Tipo
Uma classe pode extender outra para forma uma nova classe.
Considere a classe Ord:
min x y | x <= y = x
| otherwise = y
max x y | x <= y = y
| otherwise = x
Ou seja, antes de ser uma instância de Ord, o tipo deve ser também
instância de Eq.
125
Instância de Ord
b <= c = (b < c) || (b == c)
b > c = c < b
b >= c = c <= b
126
Classes de tipos
Lembrando:
127
Eq - classe da igualdade
128
Eq - classe da igualdade
> 1 == 2
False
> [1,2,3] == [1,2,3]
True
> ”Ola” /= ”Alo”
True
129
Ord - classe de ordem
130
Ord - classe de ordem
> 4 < 6
> min 5 0
> max 'c' 'h'
> ”Ola” <= ”Olaf”
131
Show - classe imprimíveis
132
Show - classe imprimíveis
133
Read - classe legíveis
134
Read - classe legíveis
135
Num - classe numérica
136
Num - classe numérica
> 1 + 3
> 6 - 9
> 12.3 * 5.6
137
Num - classe numérica
> negate 2
> abs 6
> signum (-1)
> fromInteger 3
138
Num - classe numérica
139
Integral - classe de números inteiros
140
Integral - classe de números inteiros
141
Integral - classe de números inteiros
> 10 `quot` 3
> 10 `rem` 3
> 10 `div` 3
> 10 `mod` 3
142
Integral - classe de números inteiros
143
Fractional - classe de números inteiros
144
Fractional - classe de números inteiros
> 10 / 3
> recip 10
145
Outros operadores e funções úteis
146
Floating - classe de números de ponto flutuante
147
Floating - classe de números de ponto flutuante
sin :: a -> a
cos :: a -> a
tan :: a -> a
148
Floating - classe de números de ponto flutuante
asin :: a -> a
acos :: a -> a
atan :: a -> a
149
Floating - classe de números de ponto flutuante
sinh :: a -> a
cosh :: a -> a
tanh :: a -> a
asinh :: a -> a
acosh :: a -> a
atanh :: a -> a
150
Info
151
Info
152
Derivação de instâncias
153
Classe Enum
Implementa as funções:
154
Classe Enum
Enum é enumerativo:
155
Exercício
156
Resposta
157
Resposta
158
Resposta
159
Projeto para casa
160