29
Programação Programação Funcional Funcional Introdução à Linguagem Introdução à Linguagem Funcional Haskell Funcional Haskell 1a. Seção de Slides

Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

Embed Size (px)

Citation preview

Page 1: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

Programação Programação FuncionalFuncional

Introdução à LinguagemIntrodução à LinguagemFuncional HaskellFuncional Haskell

1a. Seção de Slides

Page 2: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

2

Autoria, Méritos,Agradecimentos,

e Parceria

• Vladimir Oliveira Di IorioDPI - UFV

• http://www.dpi.ufv.br/~vladimir/

Page 3: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

3

Alterações

• Responsabilidade: Claudio Cesar de Sá

[email protected], [email protected]

Page 4: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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).

Page 5: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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/

Page 6: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

6

Livros Textos

• Haskell- The Craft of Functional Programming, Second Edition, Simon Thompson, Addison-Wesley, 507 pages, paperback, 1999 (está na fotocopiadora disponível)

Page 7: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 8: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

8

A proposta original de função:

A

b

15

17

f_função(A)

g_função(b)

Page 9: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

9

Agora...

A b15 17

f_função

g_função

Todos cidadãos

de 1a. Classe !

Page 10: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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.

Page 11: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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.

Page 12: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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 .

Page 13: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 14: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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 .

Page 15: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 16: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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)

Page 17: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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...

Page 18: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 19: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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.

Page 20: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 21: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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;

Page 22: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 23: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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>

Page 24: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 25: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 26: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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

Page 27: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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>

Page 28: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

28

Fim da 1a. Seção...

Page 29: Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides

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.