Escolar Documentos
Profissional Documentos
Cultura Documentos
Haskell
22 de Setembro de 2018
1
Introdução
2
Paradigmas de Programação
3
Paradigmas de Programação
4
Paradigma Estruturado
aprovados = {}
for (i = 0; i < length(alunos); i++) {
a = alunos[i];
if (a.nota >= 5) {
adiciona(aprovados, toUpper(a.nome));
}
}
return sort(aprovados);
5
Orientação a Objetos
class Aprovados {
private ArrayList aprovados;
public Aprovados () {
aprovados = new ArraList();
}
public addAluno(aluno) {
if (aluno.nota >= 5) {
aprovados.add(aluno.nome.toUpper());
}
}
public getAprovados() {
return aprovados.sort();
}
} 6
Paradigma Funcional
7
Paradigma Funcional
8
Paradigma Funcional no Python
map(anonima, lista)
filter(par, lista)
def preguicosa(x):
for i in range(x):
yield anonima(x)
9
Paradigma Funcional no Java
array.stream()
.filter(n -> (n % 2) == 0);
10
Haskell
11
Haskell
12
Haskell: Características
13
Haskell: Características
Exemplo em Java:
int x = 10;
double y = 5.1;
System.out.println(”Resultado: ” + (x*y));
OK!
14
Haskell: Características
Exemplo em Haskell:
x = 10 :: Int
y = 5.1 :: Double
print (”Resultado: ” + (x*y) )
ERRO!
15
Haskell: Características
𝑥𝑠 = {𝑥 ∣ 𝑥 ∈ ℕ, 𝑥 ímpar}
16
Haskell: Características
x = 1.0
x = 2.0
ERRO!
17
Haskell: Características
int x = 1;
for (int i = 1; i <= 10; i++) {
x = x*2;
}
printf(”%d\n”, x);
18
Haskell: Características
f 0 = 1
f n = 2 * f (n-1)
print (f 10)
19
Haskell: Características
20
Haskell: Características
1 + 2 -- 3
1.0 + 3.0 -- 4.0
(2%3) + (3%6) -- (7%6)
21
Haskell: Características
22
Ambiente de Programação
23
GHC e GHCi
24
Instalação
No terminal:
ou
25
Editores recomendados
com os pacotes:
26
Editores recomendados
Atom
com os pacotes:
• haskell-grammar
• language-haskell
27
Primeiro Projeto
28
Primeiro projeto compilável
29
Stack
30
Stack
31
Main.hs
main :: IO ()
main = do -- início da função principal
putStrLn ”hello world” -- imprime hello world
32
Interpretador GHCi
$ stack ghci
> 2+3*4
14
> (2+3)*4
20
33
Interpretador GHCi
$ stack ghci
> 2+3*4^5 == 2 + (3 * (4^5))
34
Informação de operadores
> :i (+)
class Num a where
(+) :: a -> a -> a
...
-- Defined in ‘GHC.Num’
infixl 6 +
35
Funções
f a b -- f(a,b)
f a b + c*d -- f(a,b) + c*d
36
Funções
Matemática Haskell
𝑓(𝑥) fx
𝑓(𝑥, 𝑦) fxy
𝑓(𝑔(𝑥)) f (g x)
𝑓(𝑥, 𝑔(𝑦)) f x (g y)
𝑓(𝑥)𝑔(𝑦) fx*gy
37
Funções
dobra x = x + x
38
Funções
No GHCi:
> :l teste.hs
> quadruplica 10
40
39
Funções
e no GHCi:
> :reload
> fatorial 5
120
40
Outros comandos do GHCi
> :t dobra
dobra :: Num a => a -> a
> :q
$
41
Convenções
42
Requisitos dos nomes
43
Nomes reservados
44
Convenção para listas
45
Regra de layout
f x = a * x + b
where
a = 1
b = 3
z = f 2 + 3
46
Tabs vs Espaço
47
Comentários
{-
dobra recebe uma variável numérica
e retorna seu valor em dobro.
-}
48
Tipos de dados
49
Tipos de dados
Exemplos:
50
Tipos de dados
v :: T
51
Tipos de dados
False :: Bool
True :: Bool
10 :: Int
52
Tipos Básicos
53
Tipos Básicos
54
Tipos Básicos
55
Tipos Básicos
x = 3
O tipo de x pode ser Int, Integer, Float e Double. Qual tipo devemos
atribuir a x?
56
Listas
[1,2,3,4]
57
Listas
[1,2,3,4] :: [Int]
[False, True, True] :: [Bool]
['o', 'l', 'a'] :: [Char]
58
Listas
59
Listas
Notem que:
60
Tuplas
61
Tuplas
Notem que:
62
Funções
63
Funções de múltiplos argumentos
64
Polimorfismo
65
Tipos polimórficos
[1,2,3,4] :: [Int]
[False, True, True] :: [Bool]
['o', 'l', 'a'] :: [Char]
66
Tipos polimórficos
[1,2,3,4] :: [Int]
[False, True, True] :: [Bool]
['o', 'l', 'a'] :: [Char]
67
Tipos polimórficos
Quem é a?
68
Tipos polimórficos
69
Overloaded types
70
Overloaded types
A ideia de que uma função pode ser aplicada a apenas uma classe de
tipos é explicitada pela Restrição de classe (class constraint). E é
escrita na forma C a, onde C é o nome da classe e a uma variável de
tipo.
71
Overloaded types
72
Exemplos de funções
73
Exemplos de funções
74
Exemplos de funções
75
Exercício 01
76
Resposta 01
77
Cláusula where
f x = y + z
where
y = e1
z = e2
78
Exemplo
79
Exercício 02
80
Resposta 02
81
Condicionais
ou
82
Condicionais
83
Exercício 03
84
Resposta 03
85
Expressões guardadas (Guard Expressions)
86
Expressões guardadas (Guard Expressions)
87
Exercício 04
88
Resposta 04
89
Nota sobre erro
90
Pattern Matching
91
Pattern Matching
92
Pattern Matching
93
Pattern Matching
94
Pattern Matching
95
Pattern Matching
96
Pattern Matching
97
Pattern Matching
98
Expressões 𝜆
99
Operadores
ou
100
Operadores
> mod 10 3
1
> 10 `mod` 3
1
101
Operadores
102
Operadores
> (/) 4 2
2
> (/2) 4
2
> (4/) 2
2
103
Exercício 05
104
Resposta 05
105
Listas
106
Listas
107
Listas
data [] a = [] | a : [a]
108
Listas
lista = 1 : 2 : 3 : 4 :[]
109
Listas
lista = 1 : 2 : 3 : 4 :[]
110
Criando listas
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
111
Criando listas
112
Criando listas
113
Criando listas
Lista infinita:
114
Ao infinito e além
lista = [0,2..]
115
Ao infinito e além
lista = 0 : 2 : geraProximo
116
Ao infinito e além
Então a lista infinita não existe em memória, apenas uma função que
gera quantos elementos você precisar dela.
117
COFFEE BREAK (não incluso)
118
Funções básicas para manipular listas
119
Recuperar elementos
Note que esse operador é custoso para listas ligadas! Não abuse dele!
120
Recuperar elementos
121
Recuperar elementos
122
Exercício 06
123
Exercício 06
124
Recuperar elementos
125
Recuperar elementos
126
Exercício 07
127
Resposta 07
128
Tamanho da lista
129
Somatória e Produtória
130
Concatenando listas
131
Exercício 08
132
Resposta 08
133
Pattern Matching com Listas
134
Pattern Matching
135
Pattern Matching
• Lista vazia: []
• Lista com um elemento: (x : [])
• Lista com um elemento seguido de vários outros: (x : xs)
136
Implementando a função nulo
137
Implementando a função tamanho
138
Exercício 09
139
Resposta 09
140
Strings
141
Compreensão de Listas
142
Definindo conjuntos na matemática
{𝑥2 ∣ 𝑥 ∈ {1..5}}
143
Compreensão de Listas
144
Compreensão de Listas
145
Compreensão de Listas
146
Compreensão de Listas
147
Compreensão de Listas
148
Compreensão de Listas
Equivalente a:
149
Exemplo: concat
150
Exemplo: concat
151
Exercício 10: length
152
Resposta 10
153
Guards
154
Divisores
Vamos criar uma função chamada divisores que retorna uma lista de
todos os divisores de n. Qual a assinatura?
155
Divisores
Vamos criar uma função chamada divisores que retorna uma lista de
todos os divisores de n. Quais os parâmetros?
156
Divisores
Vamos criar uma função chamada divisores que retorna uma lista de
todos os divisores de n. Qual o gerador?
157
Divisores
Vamos criar uma função chamada divisores que retorna uma lista de
todos os divisores de n. Qual o guard?
158
Divisores
Vamos criar uma função chamada divisores que retorna uma lista de
todos os divisores de n. Qual o guard?
159
Divisores
> divisores 15
[1,3,5,15]
160
Exercício 11
161
Resposta 11
162
Primo
primo 10 => 1 : _ == 1 : 10 : [] (1 == 1)
=> 1 : 2 : _ == 1 : 10 : [] (2 /= 10)
False
163
Primos
Com a função primo podemos gerar a lista dos primos dentro de uma
faixa de valores:
164
A função zip
165
Função pairs
Vamos criar uma função que, dada uma lista, retorna os pares dos
elementos adjacentes dessa lista, ou seja:
166
Função pairs
A assinatura será:
167
Função pairs
E a definição será:
168
Exercício 12
169
Resposta 12
170
Recursão
171
Recursão
𝑛! = 𝑛.(𝑛 − 1)!
172
Recursão
Caso base:
1! = 0! = 1
173
Recursão
Para 𝑛 = 3:
3! = 3 . 2! = 3 . 2 . 1! = 3 . 2 . 1 = 6
174
Recursão
175
Recursão
176
Fatorial
> fatorial 4
=> 4 * fatorial 3
=> 4 * (3 * fatorial 2)
=> 4 * (3 * (2 * fatorial 1))
=> 4 * (3 * (2 * 1))
=> 4 * (3 * 2)
=> 4 * 6
=> 24
177
Fatorial
> fatorial 4
=> 4 * fatorial 3
=> 4 * (3 * fatorial 2)
=> 4 * (3 * (2 * fatorial 1))
=> 4 * (3 * (2 * 1))
=> 4 * (3 * 2)
=> 4 * 6
=> 24
178
Fatorial
> fatorial 4
=> 4 * fatorial 3
=> 4 * (3 * fatorial 2)
=> 4 * (3 * (2 * fatorial 1))
=> 4 * (3 * (2 * 1))
=> 4 * (3 * 2)
=> 4 * 6
=> 24
179
Máximo Divisor Comum
180
Máximo Divisor Comum
> gcd 48 18
=> gcd 18 12
=> gcd 12 6
=> gcd 6 0
=> 6
181
Multiplicação Etíope
182
Multiplicação Etíope
Exemplo:
m n r
14 12 0
7 24 24
3 48 72
1 96 168
183
Multiplicação Etíope
184
Multiplicação Etíope
185
Recursão em Listas
186
Funções recursivas em listas
187
Funções recursivas em listas
188
Funções recursivas em listas
189
Exercício 13
190
Exercício 13
191
Produtória
192
Produtória
193
Produtória
194
Tamanho
E a função length?
195
Tamanho
E a função length?
196
Padrões de Programação
Nas próximas aulas vamos criar funções que generalizam tais padrões.
197
Invertendo uma lista
> :t reverse
reverse :: [a] -> [a]
> reverse [1,2,3]
[3,2,1]
198
Invertendo uma lista
Vamos começar pelo caso base, o inverso de uma lista vazia, é vazia:
199
Invertendo uma lista
200
Invertendo uma lista
Vamos começar pelo caso base, o inverso de uma lista com dois
elementos é:
201
Invertendo uma lista
Vamos começar pelo caso base, o inverso de uma lista com três
elementos é:
202
Invertendo uma lista
Esse último caso base nos dá uma ideia de como generalizar! Note
que:
203
Invertendo uma lista
Vamos começar pelo caso base, o inverso de uma lista com três
elementos é:
204
Exercício 14
205
Resposta 14
206
Exercício 15
Crie uma função recursiva chamada isort que utiliza a função insert
para implementar o Insertion Sort:
207
Resposta 15
208
Recusão Múltipla
209
Exercício 16
210
Resposta
211
Quickcheck
212
Testando propriedades do algoritmo
213
Testando propriedades do algoritmo
214
QuickCheck
215
Testando QuickSort
Vamos trocar o sinal <= pelo sinal de < no nosso código do qsort:
import Test.QuickCheck
216
Funções de propriedades
217
Idempotência
218
Tamanho da lista
219
Tamanho da lista
220
Casos de teste
221
Verificando nossas propriedades
Oops!
222
QuickCheck
223
QuickCheck
O que houve?
224
QuickCheck
225
Mínimo == head
226
Mínimo == head
227
Mínimo == head
228
Mínimo == head
229
Testando com um modelo
230
Tarefa para casa
231
Sugestões de exercícios para praticar
232
Sugestões de exercícios para praticar
233