Escolar Documentos
Profissional Documentos
Cultura Documentos
Haskell
Aplicações em data science e na web
Dia 01
1
Introdução
Paradigmas de Programação
2
Paradigmas de Programação
3
Paradigma Estruturado
1 aprovados = {}
2 for (i = 0; i < length(alunos); i++) {
3 a = alunos[i];
4 if (a.nota >= 5) {
5 adiciona(aprovados, toUpper(a.nome));
6 }
7 }
8 return sort(aprovados);
4
Orientação a Objetos
1 class Aprovados {
2 private ArrayList aprovados;
3 public Aprovados () {
4 aprovados = new ArraList();
5 }
6 public addAluno(aluno) {
7 if (aluno.nota >= 5) {
8 aprovados.add(aluno.nome.toUpper());
9 }
10 }
11 public getAprovados() {
12 return aprovados.sort();
13 }
14
15 }
5
Paradigma Funcional
6
Paradigma Funcional
7
Paradigma Funcional no Python
map(anonima, lista)
filter(par, lista)
def preguicosa(x):
for i in range(x):
yield anonima(x)
8
Paradigma Funcional no Java
6 array.stream()
7 .filter(n -> (n % 2) == 0);
9
Haskell
Haskell
10
Haskell: Características
11
Haskell: Características
Exemplo em Java:
1 int x = 10;
2 double y = 5.1;
3 System.out.println("Resultado: " + (x*y));
OK!
12
Haskell: Características
Exemplo em Haskell:
1 x = 10 :: Int
2 y = 5.1 :: Double
3 print ("Resultado: " + (x*y) )
ERRO!
13
Haskell: Características
xs = {x | x ∈ N, x ímpar}
14
Haskell: Características
1 x = 1.0
2 x = 2.0
ERRO!
15
Haskell: Características
1 int x = 1;
2 for (int i = 1; i <= 10; i++) {
3 x = x * 2;
4 }
5 printf("%d\n", x);
16
Haskell: Características
1 f 0 = 1
2 f n = 2 * f (n-1) -- Note que f(x) é o mesmo que f x
3
4 print (f 10)
17
Haskell: Características
18
Haskell: Características
1 1 + 2 -- 3
2 1.0 + 3.0 -- 4.0
3 (2%3) + (3%6) -- (7%6)
19
Haskell: Características
20
Para saber mais
21
Ambiente de Programação
GHC e GHCI
22
Glasgow Haskell Compiler
23
Instalação Stack
■ Haskell Stack
▶ ATENÇÃO!!!! NÃO UTILIZE O APT-GET PARA INSTALAR O GHC
OU O STACK!
▶ Para instalar o Stack no Linux :
ou
24
Verificando a instalação
25
Editores recomendados
26
Editores Recomendados - VSCode
28
Primeiro Projeto
Primeiro projeto compilável
29
Stack
30
Stack
31
Main.hs
3 main :: IO ()
4 main = do -- início da função principal
5 putStrLn "hello world" -- imprime hello world
32
Interpretador GHCi
1 $ stack ghci
2 > 2+3*4
3 14
4
5 > (2+3)*4
6 20
7
33
Interpretador GHCi
1 $ stack ghci
2 > 2+3*4^5 == 2 + (3 * (4^5))
34
Informação de operadores
1 > :i (+)
2 class Num a where
3 (+) :: a -> a -> a
4 ...
5 -- Defined in ‘GHC.Num’
6 infixl 6 +
1 f a b -- f(a,b)
2 f a b + c*d -- f(a,b) + c*d
36
Funções
Matemática Haskell
f(x) fx
f(x, y) fxy
f(g(x)) f (g x)
f(x, g(y)) f x (g y)
f(x)g(y) fx*gy
37
Funções
1 dobra x = x + x
2
38
Funções
No GHCi:
1 > :l teste.hs
2 > quadruplica 10
3 40
39
Funções
e no GHCi:
1 > :reload
2 > fatorial 5
3 120
40
Outros comandos do GHCi
1 > :t dobra
2 dobra :: Num a => a -> a
3
4 > :q
5 $
41
Outras coisas interessantes a saber
■ :h - Imprime a ajuda
■ :{ seguido de comandos e finalizado por :} permite
comandos com múltiplas linhas
▶ Também é possível separar as linhas com ;
1 > :{
2 | fatorial 0 = 1
3 | fatorial n = n * fatorial (n - 1)
4 | :}
5 > fatorial 5
6 120
7 > fatorial2 0 = 1 ; fatorial2 n = n * fatorial2 (n - 1)
8 > fatorial2 7
9 5040
42
Para saber mais
■ Funções
■ [GH] 4
■ [SGS] 2
■ [ML] 4
43
Convenções
Requisitos dos nomes
44
Nomes reservados
45
Convenção para listas
46
Regra de layout
1 f x = a*x + b
2 where
3 a = 1
4 b = 3
5 z = f 2 + 3
47
Tabs vs Espaço
48
https://www.youtube.com/watch?v=SsoOG6ZeyUI
Comentários
4 {-
5 dobra recebe uma variável numérica
6 e retorna seu valor em dobro.
7 -}
49
Tipos de dados
Tipos de dados
Exemplos
■ Int compreende todos os valores de números inteiros.
■ Bool contém apenas os valores True e False,
representando valores lógicos
50
Tipos de dados
1 v :: T
51
Tipos de dados
1 False :: Bool
2 True :: Bool
3 10 :: Int
52
Tipos Básicos
53
Tipos Básicos
Os tipos são:
1
Este é o nome oficial do caracter na tabela Unicode v.7.0!
54
Tipos Básicos
55
Tipos Básicos
1 x = 3
Pergunta
Qual tipo devemos atribuir a x?
56
Listas
1 [1,2,3,4]
57
Listas
1 [1,2,3,4] :: [Int]
2 [False, True, True] :: [Bool]
3 ['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
Para saber mais
65
Polimorfismo
Tipos polimórficos
1 [1,2,3,4] :: [Int]
2 [False, True, True] :: [Bool]
3 ['o', 'l', 'a'] :: [Char]
Pergunta
Qual é então o tipo de length?
66
Tipos polimórficos
■ Quem é a?
67
Tipos polimórficos
68
Overloaded types
69
Overloaded types
70
Overloaded types
71
Overloaded types
1 3 :: Num a => a
72
Exemplos de funções
73
Exemplos de funções
74
Exemplos de funções
75
Exercício 1
76
Resposta 1
77
Cláusula where
1 f x = y + z
2 where
3 y = e1
4 z = e2
78
Exemplo
79
Exercício 2
80
Resposta 2
81
Condicionais
ou
82
Condicionais
83
Exercício 3
84
Resposta 3
85
Expressões guardadas (Guard Expressions)
86
Expressões guardadas (Guard Expressions)
87
Exercício 4
88
Resposta 4
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
1 > mod 10 3
2 1
3 > 10 `mod` 3
4 1
101
Operadores
102
Operadores
1 > (/) 4 2
2 2
3 > (/2) 4
4 2
5 > (4/) 2
6 2
103
Exercício 5
104
Resposta 5
105
Para saber mais
■ Tipos polimórficos
▶ [GH] 3; [SGS] 2; [ML] 3
■ Funções, casamento de padrões, guardas, lambdas
▶ [GH] 4; [SGS] 2; [ML] 4
■ Uma brevíssima introdução à Cálculo λ com Haskell
▶ O combinador Y
■ Syntax and Semantics of Programming Languages
(Lambda Calculus, Cap. 5)
106
Listas
Listas
107
Listas
1 data [] a = [] | a : [a]
108
Listas
1 lista = 1 : 2 : 3 : 4 :[]
109
Listas
1 lista = 1 : 2 : 3 : 4 :[]
110
Criando listas
1 [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
1 lista = [0,2..]
115
Ao infinito e além
1 lista = 0 : 2 : geraProximo
116
Ao infinito e além
117
Para saber mais
■ Listas
■ Livros [GH] 5; [SGS] 2; [ML] 2
118
COFFEE BREAK (não incluso)
Funções básicas para manipulação
de listas
Recuperar elementos - !!
119
Recuperar elementos - head
120
Recuperar elementos - tail
121
Exercício 6
122
Exercício 6 - Solução
123
Recuperar elementos - take
124
Recuperar elementos - drop
125
Exercício 7
126
Exercício 7 - Solução
127
Tamanho da lista - length
128
Somatória e Produtória
Pergunta
Quais tipos de lista são aceitos pelas funções sum e product?
129
Concatenando listas
130
Exercício 8
131
Exercício 8 - Solução
132
Pattern Matching com Listas
Pattern Matching
133
Pattern Matching
134
Implementando a função nulo
135
Implementando a função tamanho
136
Exercício 9
137
Exercício 9 - Solução
138
Strings
139
Compreensão de Listas
Definindo conjuntos na matemática
{x2 | x ∈ {1..5}}
140
Compreensão de Listas
141
Compreensão de Listas
142
Compreensão de Listas
143
Compreensão de Listas
144
Compreensão de Listas
145
Compreensão de Listas
Equivalente a:
146
Exemplo: concat
147
Exemplo: concat
148
Exercício 10 - length
149
Exercício 10 - length - Solução
150
Guards
151
Exemplo: Divisores
1 Qual a assinatura?
152
Exemplo: Divisores
1 Qual a assinatura?
2 Quais os parâmetros?
153
Exemplo: Divisores
1 Qual a assinatura?
2 Quais os parâmetros?
3 Qual o gerador?
154
Exemplo: Divisores
1 Qual a assinatura?
2 Quais os parâmetros?
3 Qual o gerador?
4 Qual o guard?
155
Exemplo: Divisores
1 Qual a assinatura?
2 Quais os parâmetros?
3 Qual o gerador?
4 Qual o guard?
156
Exemplo: Divisores
1 > divisores 15
2 [1,3,5,15]
157
Exercício 11
158
Exercício 11 - Solução
159
Primo
1 primo 10 => 1 : _ == 1 : 10 : [] (1 == 1)
2 => 1 : 2 : _ == 1 : 10 : [] (2 /= 10)
3 False
160
Primos
161
A função zip
162
Função pairs
Vamos criar uma função que, dada uma lista, retorna os pares
dos elementos adjacentes dessa lista, ou seja:
163
Função pairs
A assinatura será:
164
Função pairs
E a definição será:
165
Exercício 12
166
Exercício 12 - Solução
167
Para saber mais
■ Listas
■ Livros [GH] 5; [SGS] 2; [ML] 2
168
Recursão
Recursão
169
Recursão
170
Recursão
n! = n.(n − 1)!
171
Recursão
■ Caso base:
1! = 0! = 1
172
Recursão
■ Para n = 3:
3! = 3 . 2! = 3 . 2 . 1! = 3 . 2 . 1 = 6
173
Recursão
174
Recursão
175
Fatorial
1 > fatorial 4
2 => 4 * fatorial 3
3 => 4 * (3 * fatorial 2)
4 => 4 * (3 * (2 * fatorial 1))
5 => 4 * (3 * (2 * 1))
6 => 4 * (3 * 2)
7 => 4 * 6
8 => 24
176
Fatorial
1 > fatorial 4
2 => 4 * fatorial 3
3 => 4 * (3 * fatorial 2)
4 => 4 * (3 * (2 * fatorial 1))
5 => 4 * (3 * (2 * 1))
6 => 4 * (3 * 2)
7 => 4 * 6
8 => 24
177
Fatorial
1 > fatorial 4
2 => 4 * fatorial 3
3 => 4 * (3 * fatorial 2)
4 => 4 * (3 * (2 * fatorial 1))
5 => 4 * (3 * (2 * 1))
6 => 4 * (3 * 2)
7 => 4 * 6
8 => 24
178
Máximo Divisor Comum
179
Máximo Divisor Comum
1 > gcd 48 18
2 => gcd 18 12
3 => gcd 12 6
4 => gcd 6 0
5 => 6
180
Recursão em Listas
Funções recursivas em listas
181
Funções recursivas em listas
182
Funções recursivas em listas
183
Exercício 13
184
Exercício 13 - Solução
185
Produtória
186
Produtória
187
Produtória
188
Tamanho
E a função length?
189
Tamanho
E a função length?
190
Padrões de Programação
191
Exercício 14
192
Exercício 14 - Resposta
193
Exercício 15
194
Exercício 15 - Resposta
195
Recursão Múltipla
196
Exercício 16
197
Exercício 16 - Resposta
198
Para saber mais
■ Recursão
▶ Exercícios
■ Livros [GH] 6; [SGS] 2; [ML] 5
■ Livros [GH] 5; [SGS] 2; [ML] 2
199
Tarefa para casa
Para entregar
■ Lista 1
▶ Prazo: 19/10
▶ Link para submissão:
https://classroom.github.com/a/1ayC4yUs
■ Não deixe de escolher o seu nome na lista para que
possamos relacionar o usuário GitHub à você!
200
Sugestões de exercícios para praticar
201
Sugestões de exercícios para praticar
202
Referências
Livros
203
Livros
204
Livros
■ [SGS]
205
Livros
■ [ML]
206