300 likes | 478 Views
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á
E N D
Programação Funcional Introdução à LinguagemFuncional Haskell 1a. Seção de Slides
Autoria, Méritos,Agradecimentos,e Parceria • Vladimir Oliveira Di IorioDPI - UFV • http://www.dpi.ufv.br/~vladimir/
Alterações • Responsabilidade: Claudio Cesar de Sá • claudio@joinville.udesc.br, claudio@aceadm.com.br
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).
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/
Livros Textos • Haskell- The Craft of Functional Programming, Second Edition, Simon Thompson, Addison-Wesley, 507 pages, paperback, 1999 (está na fotocopiadora disponível)
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:
A proposta original de função: f_função(A) 15 17 A b g_função(b)
Agora... Todos cidadãos de 1a. Classe ! A b 15 17 f_função g_função
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
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.
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 .
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
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 ..
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?
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)
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...
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:
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.
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:
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;
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
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.
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
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":
---------------------------- -- 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
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:
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.