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/ 2 Alterações • Responsabilidade: Claudio Cesar de Sá • [email protected], [email protected] 3 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). 4 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/ 5 Livros Textos • Haskell- The Craft of Functional Programming, Second Edition, Simon Thompson, AddisonWesley, 507 pages, paperback, 1999 (está na fotocopiadora disponível) 6 O que é uma função? • Uma função fornece um valor de output o qual depende de alguns valores de input: 12 34 inputs # output 46 7 A proposta original de função: A b f_função(A) 15 g_função(b) 17 8 Agora... Todos cidadãos de 1a. Classe ! f_função A 15 b 17 g_função 9 Exemplo de script em Haskell O símbolo -- faz ---------------------------com que a parte da -- example.hs Declara uma nova função, linha à sua direita Sintaxe para aplicação ---------------------------especificando seu tipo. comentário. answer :: Int deseja umaum função fa Determina que answer O símbolo :: pode ser lido answer = 42 argumentos a, b, c: tem o valor 42. Equação que define a como "é do tipo..." Determina que square é uma f a b c square :: Int -> Int função. Define resultado, função deoInt para Int . square square xx = x * x x*x , da aplicação de Nomes de Nomes funções tipos allEqual :: Int -> Intde -> Int -> sobre Bool x (variável). square allEqual m ncomeçam p com = (m==n) && letras (n==p) começam letras com minúsculas. maiúsculas. maxi :: Int -> Int -> Int 1 2 3 4 5 6 7 8 9 10 11 12 13 14 maxi m n 15 | m >= n 16 | otherwise = m = n 10 Exemplo de script em Haskell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ----------------------------- example.hs ---------------------------answerDeclara :: Int allEqual como uma answer = 42que recebe três objetos Int função e retorna Bool. square :: Int -> Int square x = x * x allEqual :: Int -> Int -> Int -> Bool allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int maxi m n Retorna valor True | m >= n = m | otherwise = n ou False. 11 Exemplo de script em Haskell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ----------------------------- example.hs ---------------------------answer :: Int answer = 42 square :: Int -> Int square x = x * x allEqual :: Int -> Int -> Int -> Bool allEqual m n p = (m==n) && (n==p) maxi :: Int -> Int -> Int maxi m n | m >= n = m | otherwise = n Equação condicional, Determina que maxi é uma formada porrecebe cláusulas. O função de 2 objetos texto entre e = determina Int e| retorna Int . uma guarda. O valor à direita de = é retornado se a guarda for verdadeira.12 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 3 4 sumi :: Int -> Int sumi n | n <= 0 = 0 | otherwise = n + sumi (n-1) 13 Exemplo de uma função 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 soma1 :: Int -> Int soma1 1 = 1 soma1 n = n + soma1 (n-1) Main> soma1 28 uma função que calcula a soma 1+2+3... até N, recebe 1 objetos Int 7 soma2 :: Int -> Int -> Int soma2 n1 n2 | ( n1 == n2 ) = 0 soma2 n1 n2 = n2 + soma2 n1 (n2 -1) Main> soma2 27 7 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 .. 10 14 Cálculos em Haskell Como cálculos são efetuados em Haskell? 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 15 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) 16 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 Relembrando... answer :: Int answer = 42 17 Cálculos em Haskell Exemplo envolvendo equação condicional: maxi m n | m >= n = m | otherwise = n maxi 3 1 ?? 3>=1 = True = 3 maxi 3 4 ?? 3>=4 = False ?? otherwise = True = 4 18 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)) A ordem de avaliação NÃO importa! Pode-se escolher qualquer uma das expressões e avaliá-la primeiro. 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)) ?? 1>=5 = False ?? otherwise = True = (5 == 5) && (5 == (maxi 4 2)) ?? 4>=2 = True = (5 == 5) && (5 == 4) = True && False = False 20 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; 21 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> Janela no Linux 22 Hugs: Interpretador de Haskell Exemplo de interação - digitando expressões: Prelude> 5 Prelude> False Prelude> 55 Prelude> "looc si Prelude> 2+3 (1*6) == (3 `div` 5) sum [1..10] reverse "hugs is cool" sguh" Obs: sublinhado indica entrada digitada pelo usuário. 23 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 24 Hugs: Interpretador de Haskell • Novas definiçõesUm não módulo podem ser criadas a partir é uma coleção de da linha de comando. funções, descritas em um • Devem ser carregadas partir de arquivos. arquivo.a Se o módulo carregado não tem nome, o nome é • Suponha que o script apresentado estejaMain no arquivo utilizado. "example.hs": Se nada for carregado: Prelude Prelude> :load example.hs Reading file "example.hs": Hugs session for: /usr/local/share/hugs/lib/Prelude.hs example.hs Main> 25 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 = 42 ... Define o nome do módulo que será carregado. Letras maúsculas ! ahahahah 26 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 3 4 4 Exemplo1> 27 Fim da 1a. Seção... 28 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. 29