Programação
Funcional
Introdução à Linguagem
Funcional Haskell
1a. Seção de Slides
Autoria, Méritos,
Agradecimentos,
e Parceria
• Vladimir Oliveira Di Iorio
DPI - UFV
• http://www.dpi.ufv.br/~vladimir/
2
Alterações
• Responsabilidade: Claudio Cesar de
Sá
• [email protected],
[email protected]
3
Programação Funcional
• Um programa funcional consiste de uma série de
definições de funções.
• A execução de um programa funcional consiste em
calcular o valor de uma expressão, usando as
funções definidas.
• Há várias linguagem funcionais: LISP, Scheme, ML,
Haskell (a escolhida), etc.
• Os programas escritos em Haskell são geralmente
chamados de scripts, por isso a extensão
normalmente é “hs” (hakell scripts).
4
Dados Histórico
• Haskell, criada em 1986, Simon Thompson e outros; Kent
of Canterbury University ([email protected])
• Mais de 30 anos depois do Lisp e derivados
• O matemático e lógico Haskell Brooks Curry, trabalhou
com -calculus;
• Foi aluno de doutorado de David Hilbert, em Göttingen,
tendo obtido o grau de doutor em 1930. Hilbert
(*23/01/62 -- +/14/02/43) foi o matemático mais influente
do século XX
• Haskell 98 is the recent 'standard' version of Haskell.
• Various implementations: Hugs (interpreter for Windows,
Mac, Unix) and GHC, NHC, HBC (compilers).
• http://www.haskell.org/
5
Livros Textos
• Haskell- The Craft of Functional
Programming, Second Edition,
Simon Thompson, AddisonWesley, 507 pages, paperback, 1999
(está na fotocopiadora disponível)
6
O que é uma função?
• Uma função fornece um valor de output
o qual depende de alguns valores de input:
12
34
inputs
#
output
46
7
A proposta original de função:
A
b
f_função(A)
15
g_função(b)
17
8
Agora...
Todos
cidadãos
de 1a. Classe !
f_função
A
15
b
17
g_função
9
Exemplo de script em Haskell
O símbolo -- faz
---------------------------com que a parte da
-- example.hs
Declara uma nova função,
linha
à sua
direita
Sintaxe
para
aplicação
---------------------------especificando seu tipo.
comentário.
answer :: Int
deseja
umaum
função
fa
Determina
que
answer
O símbolo :: pode ser lido
answer = 42
argumentos
a,
b, c:
tem
o
valor
42.
Equação
que
define
a
como "é do
tipo..."
Determina
que
square
é uma
f
a
b
c
square :: Int -> Int
função.
Define
resultado,
função
deoInt
para Int .
square
square xx = x * x
x*x , da aplicação de
Nomes
de
Nomes
funções
tipos
allEqual
:: Int
-> Intde
->
Int -> sobre
Bool x (variável).
square
allEqual
m ncomeçam
p com
= (m==n)
&& letras
(n==p)
começam
letras
com
minúsculas.
maiúsculas.
maxi :: Int
-> Int
-> Int
1
2
3
4
5
6
7
8
9
10
11
12
13
14 maxi m n
15
| m >= n
16
| otherwise
= m
= n
10
Exemplo de script em Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
----------------------------- example.hs
---------------------------answerDeclara
:: Int allEqual como uma
answer
= 42que recebe três objetos Int
função
e retorna Bool.
square :: Int -> Int
square x = x * x
allEqual :: Int -> Int -> Int -> Bool
allEqual m n p = (m==n) && (n==p)
maxi :: Int -> Int -> Int
maxi m n Retorna valor True
| m >= n
= m
| otherwise
= n
ou False.
11
Exemplo de script em Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
----------------------------- example.hs
---------------------------answer :: Int
answer = 42
square :: Int -> Int
square x = x * x
allEqual :: Int -> Int -> Int -> Bool
allEqual m n p = (m==n) && (n==p)
maxi :: Int -> Int -> Int
maxi m n
| m >= n
= m
| otherwise
= n
Equação condicional,
Determina
que maxi é uma
formada
porrecebe
cláusulas.
O
função de
2 objetos
texto entre
e = determina
Int e| retorna
Int .
uma guarda. O valor à
direita de = é retornado se
a guarda for verdadeira.12
Outros Programas
• Soma dos inteiros de 0 a n:
sumi 0 = 0
sumi n = 0 + 1 + 2 + ... + (n-1) + n
sumi n = sumi (n-1) + n
1
2
3
4
sumi :: Int -> Int
sumi n
| n <= 0
= 0
| otherwise
= n + sumi (n-1)
13
Exemplo de uma função
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
soma1 :: Int -> Int
soma1 1 = 1
soma1 n = n + soma1 (n-1)
Main> soma1
28
uma função que calcula a soma
1+2+3... até N, recebe 1 objetos Int
7
soma2 :: Int -> Int -> Int
soma2 n1 n2 | ( n1 == n2 ) = 0
soma2 n1 n2 = n2 + soma2 n1 (n2 -1)
Main> soma2
27
7
e um retorna Int
.
Uma função que calcula a
soma de um N1 até um N2,
ambos positivos. Essa
recebe 2 objetos Int e um
retorna Int ..
10
14
Cálculos em Haskell
Como cálculos são efetuados em Haskell?
allEqual m n p = (m==n) && (n==p)
allEqual 2 3 3
= (2==3) && (3==3)
= False && True
= False
allEqual 5 5 5
= (5==5) && (5==5)
= True && True
= True
15
Mantenha as “guardas”:
-- max x y retorna o maior valor de dois números
-- max :: Ord a => a -> a -> a -- isto é uma classe de tipo (mais tarde)
max x y | x > y = x
| otherwise = y
Em geral:
name pattern1 pattern2 ... patternn
| guard1 = expression1
| guard2 = expression2
...
| guardm = expressionn (n>=0, m>=1)
16
Cálculos em Haskell
Exemplos podem envolver mais de uma função:
allEqual (square 3) answer (square 2)
= ((square 3) == answer) && (answer == (square 2))
= ((3*3) == 42) && (42 == (2*2))
= (9 == 42) && (42 == 4)
= False && False
= False
Relembrando...
answer :: Int
answer = 42
17
Cálculos em Haskell
Exemplo envolvendo equação condicional:
maxi m n
| m >= n
= m
| otherwise = n
maxi 3 1
?? 3>=1 = True
= 3
maxi 3 4
?? 3>=4 = False
?? otherwise = True
= 4
18
Cálculos em Haskell
Outro exemplo envolvendo equação condicional:
allEqual (maxi 1 5) 5 (maxi 4 2)
= ((maxi 1 5) == 5) && (5 == (maxi 4 2))
A ordem de avaliação NÃO importa!
Pode-se escolher qualquer uma das
expressões e avaliá-la primeiro.
19
Cálculos em Haskell
Outro exemplo envolvendo equação condicional:
allEqual (maxi 1 5) 5 (maxi 4 2)
= ((maxi 1 5) == 5) && (5 == (maxi 4 2))
?? 1>=5 = False
?? otherwise = True
= (5 == 5) && (5 == (maxi 4 2))
?? 4>=2 = True
= (5 == 5) && (5 == 4)
= True && False
= False
20
Refletindo sobre o 1o. LAB:
• Ambiente WinHugs (“casca” do Hugs);
• Precisa de um Editor de Texto externo;
• Cuidar do nome da extensão no
Windows NT;
• :l “caminho\\nome_pgm.hs” ... load;
• Execução em linha de comando;
21
Hugs: Interpretador de Haskell
• Ao executar Hugs, uma sessão é iniciada.
• O sistema carrega funções pré-definidas (Prelude.hs)
e passa a esperar comandos:
hugs
Reading file
"/usr/local/share/hugs/lib/Prelude.hs":
Hugs session for:
/usr/local/share/hugs/lib/Prelude.hs
Type :? for help
Prelude>
Janela no Linux
22
Hugs: Interpretador de Haskell
Exemplo de interação - digitando expressões:
Prelude>
5
Prelude>
False
Prelude>
55
Prelude>
"looc si
Prelude>
2+3
(1*6) == (3 `div` 5)
sum [1..10]
reverse "hugs is cool"
sguh"
Obs: sublinhado indica entrada digitada pelo usuário.
23
Hugs: Interpretador de Haskell
• Cada linha digitada é tratada como um comando.
• Se for uma expressão, então é tratada como um
comando para avaliar a expressão.
• Alguns comandos importantes:
:? imprime a lista de todos os comandos;
:q abandona o interpretador;
:load carrega definições a partir de um arquivo,
Ex:
:load exemplos.hs
24
Hugs: Interpretador de Haskell
• Novas definiçõesUm
não módulo
podem ser
criadas
a partir
é uma
coleção
de da
linha de comando. funções, descritas em um
• Devem ser carregadas
partir
de arquivos.
arquivo.a Se
o módulo
carregado
não tem
nome, o nome
é
• Suponha que o script
apresentado
estejaMain
no arquivo
utilizado.
"example.hs":
Se nada for carregado: Prelude
Prelude> :load example.hs
Reading file "example.hs":
Hugs session for:
/usr/local/share/hugs/lib/Prelude.hs
example.hs
Main>
25
Hugs: Interpretador de Haskell
• Dando nome há um módulo ....
• Suponha arquivo "example.hs" como a seguir:
----------------------------- example.hs
---------------------------module Exemplo1 where
answer :: Int
answer = 42
...
Define o nome do módulo
que será carregado.
Letras maúsculas !
ahahahah
26
Hugs: Interpretador de Haskell
• Carregando novamente o arquivo:
Prelude> :l example.hs
Reading file "example.hs":
Hugs session for:
/usr/local/share/hugs/lib/Prelude.hs
example.hs
Exemplo1> maxi 3 4
4
Exemplo1>
27
Fim da 1a. Seção...
28
Acompanhe as instruções
sobre o Laboratório:
• Para 2as. (3as.) Feiras esteja com a
folha do Laboratório em mãos (em
papel);
• A entrega é em papel, a cada 15 dias,
ou seja, é o lab a ser entregue é o de
duas semanas passadas
• Comentários e respostas nos relatórios
são obrigatórios.
29
Download

Visualizar - GEOCITIES.ws