Upload
internet
View
115
Download
5
Embed Size (px)
Citation preview
Programação Programação FuncionalFuncional
Introdução à LinguagemIntrodução à LinguagemFuncional HaskellFuncional Haskell
1a. Seção de Slides
2
Autoria, Méritos,Agradecimentos,
e Parceria
• Vladimir Oliveira Di IorioDPI - UFV
• http://www.dpi.ufv.br/~vladimir/
4
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).
5
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/
6
Livros Textos
• Haskell- The Craft of Functional Programming, Second Edition, Simon Thompson, Addison-Wesley, 507 pages, paperback, 1999 (está na fotocopiadora disponível)
7
O que é uma função?
• Uma função fornece um valor de output o qual depende de alguns valores de input:
inputsoutput
#12
34
46
8
A proposta original de função:
A
b
15
17
f_função(A)
g_função(b)
9
Agora...
A b15 17
f_função
g_função
Todos cidadãos
de 1a. Classe !
10
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
Exemplo de script em HaskellO símbolo -- faz
com que a parte da linha à sua direita
seja um comentário.
O símbolo -- faz com que a parte da linha à sua direita
seja um comentário.
Declara uma nova função, especificando seu tipo.
O símbolo :: pode ser lido como "é do tipo..."
Declara uma nova função, especificando seu tipo.
O símbolo :: pode ser lido como "é do tipo..."
Determina que answer tem o valor 42.
Determina que answer tem o valor 42.
Determina que square é uma função de Int para Int .
Determina que square é uma função de Int para Int .
Equação que define a função. Define o resultado, x*x , da aplicação de
square sobre x (variável).
Equação que define a função. Define o resultado, x*x , da aplicação de
square sobre x (variável).
Sintaxe para aplicação de uma função f a argumentos a, b, c:
f a b c
Sintaxe para aplicação de uma função f a argumentos a, b, c:
f a b csquare x
allEqual m n p
maxi m n
Nomes de funções começam com letras
minúsculas.
Nomes de funções começam com letras
minúsculas.
Nomes de tipos começam com letras
maiúsculas.
Nomes de tipos começam com letras
maiúsculas.
11
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
Exemplo de script em Haskell
Declara allEqual como uma função que recebe três objetos Int e
retorna Bool.
Declara allEqual como uma função que recebe três objetos Int e
retorna Bool.
Retorna valor True ou False.Retorna valor True ou False.
12
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
1 ----------------------------2 -- example.hs3 ----------------------------4 answer :: Int5 answer = 426 7 square :: Int -> Int8 square x = x * x910 allEqual :: Int -> Int -> Int -> Bool11 allEqual m n p = (m==n) && (n==p)1213 maxi :: Int -> Int -> Int14 maxi m n15 | m >= n = m16 | otherwise = n
Exemplo de script em Haskell
Equação condicional, formada por cláusulas. O texto entre | e = determina
uma guarda. O valor à direita de = é retornado se a
guarda for verdadeira.
Equação condicional, formada por cláusulas. O texto entre | e = determina
uma guarda. O valor à direita de = é retornado se a
guarda for verdadeira.
Determina que maxi é uma função de recebe 2 objetos
Int e retorna Int .
Determina que maxi é uma função de recebe 2 objetos
Int e retorna Int .
13
Outros Programas
1 sumi :: Int -> Int2 sumi n3 | n <= 0 = 04 | otherwise =
1 sumi :: Int -> Int2 sumi n3 | n <= 0 = 04 | otherwise =
• Soma dos inteiros de 0 a n:
= n + sumi (n-1)
sumi 0 = 0sumi n = 0 + 1 + 2 + ... + (n-1) + nsumi n = sumi (n-1) + n
14
1
2 soma1 :: Int -> Int 3 soma1 1 = 14 soma1 n = n + soma1 (n-1)5
6 7 Main> soma1 78 28910 soma2 :: Int -> Int -> Int11 soma2 n1 n2 | ( n1 == n2 ) = 012 soma2 n1 n2 = n2 + soma2 n1 (n2 -1)131415 Main> soma2 7 10 16 27
1
2 soma1 :: Int -> Int 3 soma1 1 = 14 soma1 n = n + soma1 (n-1)5
6 7 Main> soma1 78 28910 soma2 :: Int -> Int -> Int11 soma2 n1 n2 | ( n1 == n2 ) = 012 soma2 n1 n2 = n2 + soma2 n1 (n2 -1)131415 Main> soma2 7 10 16 27
Exemplo de uma função
Uma função que calcula a soma de um N1 até um N2,
ambos positivos. Essa recebe 2 objetos Int 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 ..
uma função que calcula a soma 1+2+3... até N, recebe 1 objetos Int
e um retorna Int .
uma função que calcula a soma 1+2+3... até N, recebe 1 objetos Int
e um retorna Int .
15
Cálculos em Haskell
Como cálculos são efetuados em Haskell?
allEqual m n p = (m==n) && (n==p)allEqual m n p = (m==n) && (n==p)
allEqual 2 3 3= (2==3) && (3==3)= False && True= False
allEqual 2 3 3= (2==3) && (3==3)= False && True= False
allEqual 5 5 5= (5==5) && (5==5)= True && True= True
allEqual 5 5 5= (5==5) && (5==5)= True && True= True
16
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)
17
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
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
answer :: Int answer = 42
Relembrando...
18
Cálculos em Haskell
Exemplo envolvendo equação condicional:
maxi m n | m >= n = m | otherwise = n
maxi m n | m >= n = m | otherwise = n
maxi 3 1 ?? 3>=1 = True= 3
maxi 3 1 ?? 3>=1 = True= 3
maxi 3 4 ?? 3>=4 = False ?? otherwise = True= 4
maxi 3 4 ?? 3>=4 = False ?? otherwise = True= 4
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))
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.
A ordem de avaliação NÃO importa!Pode-se escolher qualquer uma das
expressões e avaliá-la primeiro.
20
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
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
21
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;
22
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.hsType :? for helpPrelude>
hugs
Reading file "/usr/local/share/hugs/lib/Prelude.hs": Hugs session for:/usr/local/share/hugs/lib/Prelude.hsType :? for helpPrelude>
Janela no LinuxJanela no Linux
23
Hugs: Interpretador de Haskell
Exemplo de interação - digitando expressões:
Obs: sublinhado indica entrada digitada pelo usuário.
Prelude> 2+35Prelude> (1*6) == (3 `div` 5)FalsePrelude> sum [1..10]55Prelude> reverse "hugs is cool""looc si sguh"Prelude>
Prelude> 2+35Prelude> (1*6) == (3 `div` 5)FalsePrelude> sum [1..10]55Prelude> reverse "hugs is cool""looc si sguh"Prelude>
24
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
25
Prelude> :load example.hsReading file "example.hs": Hugs session for:/usr/local/share/hugs/lib/Prelude.hsexample.hsMain>
Prelude> :load example.hsReading file "example.hs": Hugs session for:/usr/local/share/hugs/lib/Prelude.hsexample.hsMain>
• Novas definições não podem ser criadas a partir da linha de comando.
• Devem ser carregadas a partir de arquivos.• Suponha que o script apresentado esteja no arquivo
"example.hs":
Um módulo é uma coleção de funções, descritas em um
arquivo. Se o módulo carregado não tem nome, o
nome Main é utilizado.Se nada for carregado: Prelude
Um módulo é uma coleção de funções, descritas em um
arquivo. Se o módulo carregado não tem nome, o
nome Main é utilizado.Se nada for carregado: Prelude
Hugs: Interpretador de Haskell
26
Hugs: Interpretador de Haskell
• Dando nome há um módulo ....• Suponha arquivo "example.hs" como a seguir:
------------------------------ example.hs----------------------------module Exemplo1 where
answer :: Intanswer = 42...
------------------------------ example.hs----------------------------module Exemplo1 where
answer :: Intanswer = 42...
Define o nome do módulo que será carregado.Letras maúsculas !
ahahahah
Define o nome do módulo que será carregado.Letras maúsculas !
ahahahah
27
Hugs: Interpretador de Haskell
• Carregando novamente o arquivo:
Prelude> :l example.hsReading file "example.hs": Hugs session for:/usr/local/share/hugs/lib/Prelude.hsexample.hsExemplo1> maxi 3 44Exemplo1>
Prelude> :l example.hsReading file "example.hs": Hugs session for:/usr/local/share/hugs/lib/Prelude.hsexample.hsExemplo1> maxi 3 44Exemplo1>
28
Fim da 1a. Seção...
29
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.