A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Programação Funcional Introdução à Linguagem Funcional Haskell 1a. Seção de Slides."— Transcrição da apresentação:

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

2 2 Autoria, Méritos, Agradecimentos, e Parceria Vladimir Oliveira Di Iorio DPI - UFV

3 3 Alterações Responsabilidade: Claudio Cesar de Sá

4 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 5 Dados Histórico Haskell, criada em 1986, Simon Thompson e outros; Kent of Canterbury University 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 Hilbert (*23/01/ /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).

6 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 7 O que é uma função? Uma função fornece um valor de output o qual depende de alguns valores de input: inputs output #

8 8 A proposta original de função: AbAb f_função(A) g_função(b)

9 9 Agora... A b f_função g_função Todos cidadãos de 1a. Classe !

10 example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | otherwise= n example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | otherwise= n Exemplo de script em Haskell 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 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). 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 c square x allEqual m n p maxi m n Nomes de funções começam com letras minúsculas. Nomes de tipos começam com letras maiúsculas.

11 example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | otherwise= n example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | otherwise= n Exemplo de script em Haskell Declara allEqual como uma função que recebe três objetos Int e retorna Bool. Retorna valor True ou False.

12 example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | otherwise= n example.hs answer :: Int 5 answer = square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int 14 maxi m n 15 | m >= n= m 16 | 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. Determina que maxi é uma função de recebe 2 objetos Int e retorna Int.

13 13 Outros Programas 1 sumi :: Int -> Int 2 sumi n 3 | n <= 0 = 0 4 | otherwise= 1 sumi :: Int -> Int 2 sumi n 3 | n <= 0 = 0 4 | otherwise= Soma dos inteiros de 0 a n: = n + sumi (n-1) sumi 0 = 0 sumi n = (n-1) + n sumi n = sumi (n-1) + n

14 soma1 :: Int -> Int 3 soma1 1 = 1 4 soma1 n = n + soma1 (n-1) Main> soma soma2 :: Int -> Int -> Int 11 soma2 n1 n2 | ( n1 == n2 ) = 0 12 soma2 n1 n2 = n2 + soma2 n1 (n2 -1) Main> soma soma1 :: Int -> Int 3 soma1 1 = 1 4 soma1 n = n + soma1 (n-1) Main> soma soma2 :: Int -> Int -> Int 11 soma2 n1 n2 | ( n1 == n2 ) = 0 12 soma2 n1 n2 = n2 + soma2 n1 (n2 -1) Main> soma 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 até N, recebe 1 objetos Int e um retorna Int.

15 15 Cálculos em Haskell Como cálculos são efetuados em Haskell? allEqual m n p = (m==n) && (n==p) allEqual = (2==3) && (3==3) = False && True = False allEqual = (2==3) && (3==3) = False && True = False allEqual = (5==5) && (5==5) = True && True = True allEqual = (5==5) && (5==5) = True && True = True

16 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 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 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 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 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 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 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.hs Type :? for help Prelude> 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

23 23 Hugs: Interpretador de Haskell Exemplo de interação - digitando expressões: Obs: sublinhado indica entrada digitada pelo usuário. Prelude> Prelude> (1*6) == (3 `div` 5) False Prelude> sum [1..10] 55 Prelude> reverse "hugs is cool" "looc si sguh" Prelude> Prelude> Prelude> (1*6) == (3 `div` 5) False Prelude> sum [1..10] 55 Prelude> reverse "hugs is cool" "looc si sguh" Prelude>

24 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 25 Prelude> :load example.hs Reading file "example.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs example.hs Main> Prelude> :load example.hs Reading file "example.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs example.hs Main> 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 26 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 = example.hs module Exemplo1 where answer :: Int answer = 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 27 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 Exemplo1> Prelude> :l example.hs Reading file "example.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs example.hs Exemplo1> maxi Exemplo1>

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

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


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

Apresentações semelhantes


Anúncios Google