1 / 29

Programação Funcional

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/. Alterações. Responsabilidade: Claudio Cesar de Sá

Download Presentation

Programação Funcional

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Autoria, Méritos,Agradecimentos,e Parceria • Vladimir Oliveira Di IorioDPI - UFV • http://www.dpi.ufv.br/~vladimir/

  3. Alterações • Responsabilidade: Claudio Cesar de Sá • claudio@joinville.udesc.br, claudio@aceadm.com.br

  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 (s.j.thompson@ukc.ac.uk) • 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. inputs # output 12 46 34 O que é uma função? • Uma função fornece um valor de output o qual depende de alguns valores de input:

  8. A proposta original de função: f_função(A) 15 17 A b g_função(b)

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

  10. 1 ---------------------------- 2 -- example.hs 3 ---------------------------- 4 answer :: Int 5 answer = 42 6 7 square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) 12 13 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..." Sintaxe para aplicação de uma função f a argumentos a, b, c: f a b c Determina que answer tem o valor 42. Equação que define a função. Define o resultado, x*x , da aplicação de square sobre x (variável). Determina que square é uma função de Int para Int . square x Nomes de funções começam com letras minúsculas. Nomes de tipos começam com letras maiúsculas. allEqual m n p maxi m n

  11. 1 ---------------------------- 2 -- example.hs 3 ---------------------------- 4 answer :: Int 5 answer = 42 6 7 square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) 12 13 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. 1 ---------------------------- 2 -- example.hs 3 ---------------------------- 4 answer :: Int 5 answer = 42 6 7 square :: Int -> Int 8 square x = x * x 9 10 allEqual :: Int -> Int -> Int -> Bool 11 allEqual m n p = (m==n) && (n==p) 12 13 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. 1 sumi :: Int -> Int 2 sumi n 3 | n <= 0 = 0 4 | otherwise = = n + sumi (n-1) 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

  14. 1 2 soma1 :: Int -> Int 3 soma1 1 = 1 4soma1 n = n + soma1 (n-1) 5 6 7 Main> soma1 7 8 28 9 10 soma2 :: Int -> Int -> Int 11 soma2 n1 n2 | ( n1 == n2 ) = 0 12 soma2 n1 n2 = n2 + soma2 n1 (n2 -1) 13 14 15 Main> soma2 7 10 16 27 Exemplo de uma função 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 de um N1 até um N2, ambos positivos. Essa recebe 2 objetos Int e um retorna Int ..

  15. 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 Cálculos em Haskell Como cálculos são efetuados em Haskell?

  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. 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 Cálculos em Haskell Exemplos podem envolver mais de uma função: answer :: Int answer = 42 Relembrando...

  18. maxi m n | m >= n = m | otherwise = n maxi 3 1 ?? 3>=1 = True = 3 maxi 3 4 ?? 3>=4 = False ?? otherwise = True = 4 Cálculos em Haskell Exemplo envolvendo equação condicional:

  19. allEqual (maxi 1 5) 5 (maxi 4 2) = ((maxi 1 5) == 5) && (5 == (maxi 4 2)) Cálculos em Haskell Outro exemplo envolvendo equação condicional: A ordem de avaliação NÃO importa! Pode-se escolher qualquer uma das expressões e avaliá-la primeiro.

  20. 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 Cálculos em Haskell Outro exemplo envolvendo equação condicional:

  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 Reading file "/usr/local/share/hugs/lib/Prelude.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs Type :? for help Prelude> 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: Janela no Linux

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

  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.hs Reading file "example.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs example.hs Main> Hugs: Interpretador de Haskell 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 • 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":

  26. ---------------------------- -- example.hs ---------------------------- module Exemplo1 where answer :: Int answer = 42 ... Hugs: Interpretador de Haskell • Dando nome há um módulo .... • Suponha arquivo "example.hs" como a seguir: Define o nome do módulo que será carregado. Letras maúsculas ! ahahahah

  27. 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> Hugs: Interpretador de Haskell • Carregando novamente o arquivo:

  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.

More Related