PNP - Capítulo 1 - Haskell
PNP - Capítulo 1 - Haskell
PNP - Capítulo 1 - Haskell
Procedimental
Haskell - Cap 1
Procedimental Estilos/Origem
Lógica
• Prolog, Trilogy, Parlog, ...
Declarativo
Funcional
• Lisp, Hugs, Haskel, ...
Paradigma Funcional
Programa: Programa:
sequência de sequência de
comandos, funções mais
procedimentos que simples;
transformam
variáveis;
Execução:
Execução: recursiva;
sequencial
História do Haskell
+ adição
- subtração
* multiplicação
/ divisão fracionária
^ potência (expoente inteiro)
div quociente (divisão inteira)
mod resto (divisão inteira)
sqrt raiz quadrada
Op. Relacional e Lógico
== igualdade
/= diferença
< > <= >= comparações
&& retorna verdade todas
preposições forem verdadeiras
|| retorna Verdade se pelo menos
uma for verdadeira
not inverte o valor booleano
Seccão
Qualquer operador binário pode ser usado
como função de dois argumentos
escrevendo-o entre parentêsis.
o > 1+2
o > (+) 1 2
o > (+1) 2
o > (2+) 1
o > mod 5 2
o > div 2 4
Funções
Os argumentos de funções são separados
por espaços:
Haskell Matemática
fx f(x)
f (g x) f(g(x))
f (g x) (h x) f(g(x),h(x))
fxy+1 f(x, y) +1
f x (y+1) f(x, y +1)
sqrt x + 1 (√x) +1
sqrt (x + 1) √(x +1)
Funções
Definições de funções em um ficheiro:
o dobro x = x + x
o quadruplo x = dobro (dobro x)
Execução:
> dobro 2
o 4
> quadruplo 2
o 8
Exercício: Criar uma função que acha média de
dois números.
Redução ou derivação
Simular o comportamento da
função:
o f1 c = c * 2 + 32
• > f1 4
o f2 k = k - 273
?
• > f2 2
o f1 c = c * 2 + 32
o f2 k = k - 273
o f3 k = f1 (f2 k)
• > f3 300
Funções recursivas
Aplicando a redução:
soma 0 = 0
soma n = n + soma (n-1)
> soma 5
?
fact 0 = 1
fact n =n * fact (n-1)
>fact 5
Identificadores
Erros de tipos
o Algumas operações só fazem sentido com
valores de determinados tipos.
o Por exemplo: não faz sentido somar
números e valores lógicos.
o > 1 + False
• ERRO
Tipos e Valores
Definição:
e::T para indicar que a expressão e
admite o tipo T.
soma::Int->Int ->Int
soma x y= x+y
soma::Double>Double ->Double
soma x y= x+y
Obs: Identificar o tipo de dados de uma
expressão:
:t True
Tipos e Valores
Exercícios:
o Função que verifica se um número é
?
par.
Túplas (T1,T2,T3,...,Tn): O 1º
elemento é do Tipo T1, 2º
elemento do tipo T2, etc.
• Exemplos:
Túpla
o Funções :
Exemplos:
• fst(2,5)
• snd( (3,2, 4.5, ’3’),”angola”)
Túpla
Exemplos de aplicação:
soma::(Int,Int,Int)->Int
soma (a,b,c)=a+b-c
somaSubtracao::(Int,Int)-
>(Int,Int)
somaSubtracao (a,b) =
(a+b , a-b)
somaSubtracao :: (Int,Int)->[Int]
somaSubtracao (a,b) = [a+b , a-b]
Algumas funções :
sum :: Num a => [a] -> a soma todos
elementos númericos de uma lista;
product :: Num a => [a] -> a multiplica todos
elementos númericos de uma lista;
zip :: [a] -> [b] -> [(a,b)] retorna o produto
cartesiano (em túplas) dos elementos da lista 1
com a lista 2;
unzip :: [(a, b)] -> ([a], [b]) retorna uma túpla
com duas listas;
even :: Int->Bool verificada se um número
inteiro é par
Listas por compreensão
É uma notação matemática (conceitos de
conjuntos):
Matemática Haskell
{x | x E {1,2,3,4,5,6}} [x | x<-[1,2,3,4,5,6]
{n|n E {9,8,-2,-10,3} ,0 <=n+2 [n | n<-[9,8,-2,-10,3], 0<=n+2,
<=10 n+2<=10]
{2x|x E {10,3,7,2}} [ 2*x | x <- [10,3,7,2] ]
{2x|x E {10,3,7,2},x<10} [ 2*x | x<- [10,3,7,2] , x<10 ]
{(x,y) | x E {3,4,5}, y E [(x,y) | X<-[3,4,5], Y<-[9,10] ]
{9,10}}
{1,2,3,4,5,6} [x | x<-[1..6]] ou tambem [1..6]
{1,3,5,7,9} [x | x<-[1,3..9]] ou tambem
[1,3..6]
Obs.: a
{‘a’,’b’..’z’} vírgula na lista representa o operador &&
[‘a’..’z’]
(e);
Representação de Listas
Definição Notação Compreensão
[1,2,3] 1:[2,3] = 1:2:[3]= 1:2:3 : [x | x<-[1,2,3,4,5]]
[]
Decomposição da lista:
(x : xs) => x será a cabeça e o xs o resto da
lista
(x:y : _) => x será o cabeça, o y o segundo
elemento, e o resto descarto;
(_:xs) => descarta o primeiro elemento e fica
com o resto.
Obs: _ Representa variável anónima
++ Concatena duas listas
: insere um elemento no princípio da lista. Ex: 3:
[4,5,6]
Listas por compreensão
ver::Int->Bool
ver x = case x of
1 -> True
2 -> True
_ -> False
Exemplo:
o (\x -> 2*x+1) 2
o (\x y-> x+y) 5 8
o (\x -> [1..x]) 4
Definições Locais
Há duas formas de fazer definições locais
utilizando:
o Let .. in primeiro define-se depois utiliza-se;
f::Int->Int->Int
fyz= let
c=10
soma y z= y+z+c
in soma y z
• where primeiro utiliza depois define-se o
valor.
f::Int->Int->Int
f a b = a+b+c+d
where c=10
Definições Locais
Exercícios:
o f1 = Let
• c = 10
Qual será o resultado:
• (a,b) = (3*c, f 2) f1
?
• f x = x+7*c
• In f a + f b
o testa y = 3 + f y + f a + f b
• where c = 10
Qual será o resultado :
• (a,b) = (3*c, f testa 5
2)
• f x = x +7*c
Capítulo 2
Conceitos avançados 1:
o Módulo
o Funções de Ordem Superior
o Entrada e Saída de Dados
o Ordenação Quick Sort
o Ordenação Insert Sort
Capítulo 3
Conceitos avançados 2:
o Classes, Objectos, Padrão @, Tipos
Sinónimos e Abstratos (Algébricos);
o Algorítmos e Estruturas de Dados
(Árvore e Grafo);
o Ficheiros
Conceitos avançados 3:
o Projecto 1