Programação Funcional Aula 1

Documentos relacionados
Programação Funcional

Programação Funcional Aulas 1 & 2

Pedro Vasconcelos DCC/FCUP. Programação Funcional 1 a Aula Apresentação

Programação Funcional

Programação Funcional. Capítulo 2. Primeiros Passos. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2013.

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Programação Funcional

Paradigmas de Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 3 a Aula Definição de funções

Aula prática 2. Definindo Funções. Resumo Vamos aprender nesta aula a fazer nossas primeiras definições de função. 1 Scripts 1.

Linguagem Funcional Haskell

Linguagens de Programação Programação Funcional (Haskell)

Programação Funcional. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Linguagem Haskell. Riocemar S. de Santana

Aula prática 14. Expressão Lambda

Expressões Lambda. Programação Funcional. Capítulo 7. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Programação Funcional Aulas 5 & 6

Implementação de Linguagens

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Linguagens de Programação Aula 13

Programação Funcional 14 a Aula Classes de tipos revisitadas

Listas em Haskell. Listas. Linguagem Haskell. Maria Adriana Vidigal de Lima. Faculdade de Computação - UFU. Setembro

Informações. Programação Funcional. Por que um curso de programação funcional? O que é Programação Funcional? Objetivos da programação funcional

Implementação de Linguagens

Linguagens de Programação Funcional

Aula Prática 3. Paradigmas da Programação I / Programação Funcional. ESI/MCC 1 o ano (2005/2006)

Linguagens de Programação e Programação Funcional

Programação Funcional 9 a Aula Programas interativos

Pedro Vasconcelos DCC/FCUP. Programação Funcional 4 a Aula Listas

Haskell. Allek Cezana Rajab Henrique Bertolo Selga João Paulo Coelho

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Pedro Vasconcelos DCC/FCUP. Programação Funcional 13 a Aula Definição de tipos

Aula Prática 2. Paradigmas da Programação I / Programação Funcional

Programação Python. Nesta aula... 1 Programação. 2 Python. Operadores e Operandos Variáveis, Expressões, Instruções Funções Ciclos Comentários

Pedro Vasconcelos DCC/FCUP. Programação Funcional 2 a Aula Tipos e classes

Layout. Módulos. Normalmente, cada módulo está armazenado num ficheiro com o mesmo nome do módulo. Exemplo.hs

Programação Funcional Aulas 9, 10 & 11

Expressões Condicionais

Programação Funcional. Capítulo 2. OCaml. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2015.

Expressões Condicionais

Linguagens de Programação Aula 14

Conceitos de Linguagens de Programação

3. Linguagem de Programação C

HASKELL. Breno Simão Boscaglia Pablo Santana Satler Ramon Pereira de Matos

Aula prática 5. Funções Recursivas

Estruturas de dados. Pedro Vasconcelos. 3 de Março de 2014

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Lógica e Linguagem de Programação Convertendo um algoritmo em pseudocódigo para a linguagem C Professor: Danilo Giacobo

Funções de Ordem Superior

Expressão Condicional

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Programação Funcional

GUIA DE FUNCIONAMENTO DA UNIDADE CURRICULAR

Python - Variáveis e expressões

Algoritmos e Programação

Pedro Vasconcelos DCC/FCUP. Programação Funcional 8 a Aula Listas infinitas

Introdução à Programação Aula 3 Primeiros programas

Programação Funcional. Capítulo 21. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2018.

Programação Funcional. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2013.

Capítulo 7. Expressões e Sentenças de Atribuição

Professor: Domingos Equipe Haskell: Lucas Montesuma, Francisco Leonardo CONCEITOS DA LINGUAGEM DE PROGRAMAÇÃO CÁLCULADORA EM HASKELL

Conhecendo a Linguagem de Programação C

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Linguagens de Programação Funcional

Pedro Vasconcelos DCC/FCUP. Programação Funcional 19 a Aula Raciocinar sobre programas

Introdução e Conceitos

Linguagens de Programação

Programação I Aula 3 Primeiros programas

Tipos Algébricos. Programação Funcional. Capítulo 11. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Puca Huachi Vaz Penna

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Introdução à Programação / Programação I

Programação I Aula 17 Correção de programas Pedro Vasconcelos DCC/FCUP

Linguagens de Programação. Programação Funcional. Carlos Bazilio

Conceitos Básicos de C

1 Introdução à Programação O que é? Para que serve?... 1

Funções de Ordem Superior

Linguagens de Programação. Marco A L Barbosa

Testes em Haskell com a framework HUnit 1.0

Programação Introdução

Laboratório de Introdução à Ciência da Computação I

Algoritmos I Aula 13 Linguagem de Programação Java

Redução de grafos. Pedro Vasconcelos. 4 de Março de 2014

Programação Funcional BCC222. Aulas 5,6. Mais sobre recursão

Introdução à Programação. Uma Abordagem Funcional

PRIMEIROS PASSOS COM PYTHON. Prof. Msc. Luis Filipe Alves Pereira 2015

Expressões e sentença de atribuição

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Conceitos Básicos Linguagem C

Casamento de Padrão. Programação Funcional. Capítulo 6. José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto

Computação I (MAB120) DCC/UFRJ

Programação de Computadores III

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Pedro Vasconcelos DCC/FCUP. Programação Funcional 7 a Aula Funções de ordem superior

Transcrição:

Programação Funcional Aula 1 Sandra Alves DCC/FCUP 2016/17 Funcionamento da disciplina Docentes: Teóricas: Sandra Alves Práticas: Sandra Alves, Manuel Barbosa, João Pedro Pedroso e Bernardo Portela Página web http://www.dcc.fc.up.pt/~sandra/home/pf1718.html exercícios) (slides de aulas e folhas de Avaliação: Teste intercalar (TI) + Exame Final (EF) F inal = T I (0.5) + EF (0.5) 1 Recurso cotado para 20 valores. Data do teste intercalar: 14 de Abril. Bibliografia Graham Hutton, Programming in Haskell, Cambridge University Press, 2007 Simon Thompson, Haskell - The Craft of Functional Programming, Addison-Wesley, 1996 Richard Bird, Philip Wadler, Introduction to Functional Programming, Prentice-Hall, 1988 Apontadores: Página do Haskell: http://www.haskell.org Tutorial: A Gentle Introduction to Haskell: http://www.haskell.org/tutorial Learn you a Haskell for great good! http://learnyouahaskell.com/ Real World Haskell http://book.realworldhaskell.org/ 1 T I, EF 6 e F inal 9.5 1

Conteúdo e objetivos Introdução à programação funcional usando Haskell Objetivos de aprendizagem: 1. definir funções usando equações com padrões e guardas; 2. implementar algoritmos recursivos elementares; 3. definir tipos algébricos para representar dados; 4. decompor problemas usando funções de ordem superior e lazy evaluation; 5. escrever programas interativos usando notação-do; 6. provar propriedades de programas usando teoria equacional e indução. O que é a programação funcional? É um paradigma de programação No paradigma imperativo, um programa é uma sequência de instruções que mudam células na memória No paradigma funcional, um programa é um conjunto de definições de funções que aplicamos a valores Podemos programar num estilo funcional em muitas linguagens Linguagens funcionais suportam melhor o paradigma funcional Exemplos: Scheme, ML, O Caml, Haskell, F#, Scala Exemplo: somar os naturais de 1 a 10 Em linguagem C: total = 0; for (i=1; i<=10; ++i) total = total + i; O programa é uma sequência de instruções O resultado é obtido por mutação das variáveis i e total Execução passo-a-passo passo instrução i total 1 total=0? 0 2 i=1 1 0 3 total=total+i 1 1 4 ++i 2 1 5 total=total+i 2 3 6 ++i 3 3 7 total=total+i 3 6 8 ++i 4 6 9 total=total+i 4 10.... 21 total=total+i 10 55 22 ++i 11 55 2

Somar os naturais de 1 a 10 Em Haskell: sum [1..10] O programa é consiste na aplicação da função sum à lista dos inteiros entre 1 e 10. Redução passo-a-passo Redução da expressão original até obter um resultado que não pode ser mais simplificado. sum [1..10] = = sum [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] = = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = = 3 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = = 6 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = = 10 + 5 + 6 + 7 + 8 + 9 + 10 =. = 55 Um exemplo maior: Quicksort Em C: int partition (int arr[], int l, int h) { int x = arr[h]; int i = (l - 1); for (int j = l; j <= h- 1; j++) { if (arr[j] <= x) { i++; swap (&arr[i], &arr[j]); } } swap (&arr[i + 1], &arr[h]); return (i + 1); } void quicksort(int A[], int l, int h) { if (l < h) { int p = partition(a, l, h); quicksort(a, l, p - 1); quicksort(a, p + 1, h); } } Em Haskell: 3

qsort [] = [] qsort (x:xs) = qsort xs1 ++ [x] ++ qsort xs2 where xs1 = [x x <-xs, x <=x] xs2 = [x x <-xs, x >x] Vantagens da programação funcional Nível mais alto programas mais concisos próximos duma especificação matemática Mais modularidade polimorfismo, ordem superior, lazy evaluation permitem decompor problemas em componentes re-utilizáveis Garantias de correção demonstrações de correção usando provas matemáticas maior facilidade em efetuar testes Concorrencia/paralelismo a ordem de execução não afecta os resultados Desvantagens da programação funcional Maior distância do hardware compiladores/interpretadores mais complexos; difícil prever os custos de execução (tempo/espaço); alguns algoritmos são mais eficientes quando implementados de forma imperativa. Programação funcional - evolução histórica 1930s: Alonzo Church desenvolve o lambda calculus, como uma teoria matemática baseada em funções 1950s: John McCarthy desenvolve o Lisp ( LISt Processor ), a primeira linguagem de programação funcional, baseada no lambda calculus, mas mantendo atribuição de variáveis 1960s: Peter Landin desenvolve o ISWIM ( If you See What I Mean ), a primeira linguagem de programação funcional pura, baseada no lambda calculus e sem atribuição 1970s: John Backus desenvolve o FP ( Functional Programming ), uma linguagem funcional com ênfase em funções de ordem superior 1970s: Robin Milner e outros desenvolvem o ML ( Meta Language ), a primeira linguagem funcional moderna, que introduz inferência de tipos e tipos polimórficos. 4

Programação funcional - evolução histórica (cont) 1970s - 1980s: David Turner desenvolve um conjunto de linguagens funcionais lazy, que culminaram com o desenvolvimento da linguagem Miranda (produzida comercialmente) 1987: um comité internacional de investigadores inicia o desenvolvimento do Haskell (cujo nome vem do lógico Haskell Curry), uma linguagem funcional lazy. 2003: É publicado o relatório Haskell 98, que define uma versão estável da linguagem, resultado de cerca de 15 anos de trabalho. 2010: Publicação do padrão da linguagem Haskell 2010. Haskell Linguagem de programação puramente funcional lazy Nomeada em homenagem ao matemático americano Haskell B. Curry (1900 1982) Concebida para ensino e também para o desenvolvimento de aplicações reais Resultado de mais de vinte anos de investigação por uma comunidade de base académica muito activa Implementações abertas e livremente disponíveis Haskell no mundo real Alguns exemplos open-source: http://www.haskell.org GHC o compilador de Haskell é escrito em Haskell (!) Xmonad um gestor de janelas usando tiling automático Darcs um sistema distribuido para gestão de código-fonte Pandoc conversor entre formatos de markup de documentos Utilizações em backend de aplicações web: Bump mover ficheiros entre smartphones http://devblog.bu.mp/haskell-at-bump Janrain plaforma de user management http://janrain.com/blog/functional-programming-social-web Chordify extração de acordes musicais http://chordify.net Mais exemplos: http://www.haskell.org/haskellwiki/haskell_in_industry Hugs Um interpretador interativo de Haskell Suporta Haskell 98 e bastantes extensões Para aprendizagem e desenvolvimento de pequenos programas Disponível em http://www.haskell.org/hugs 5

Glasgow Haskell Compiler (GHC) Compilador que gera código-máquina nativo Suporta Haskell 98, Haskell 2010 e bastantes extensões Otimização de código, interfaces a outras linguagens, profilling, grande conjunto de bibliotecas, etc. Inclui também o interpretador ghci (alternativa ao Hugs) Disponível em http://www.haskell.org/ghc Primeiros passos Linux/Mac OS: executar o hugs ou ghci Windows: executar o WinHugs ou ghci $ ghci GHCi, version 6.8.3: http://www.haskell.org/ghc/ Loading package base... linking... done. Prelude> Uso do interpretador 1. o interpretador lê uma expressão do teclado; 2. calcula o seu valor; 3. por fim imprime-o. > 2+3*5 17 > (2+3)*5 25 > sqrt (3^2 + 4^2) 5.0 Alguns operadores e funções aritméticas + adição - subtração * multiplicação / divisão fracionária ^ potência (expoente inteiro) div mod sqrt quociente (divisão inteira) resto (divisão inteira) raiz quadrada == igualdade /= diferença < > <= >= comparações 6

Algumas convenções sintáticas Os argumentos de funções são separados por espaços A aplicação tem maior precendência do que qualquer operador Haskell Matemática f x f(x) f (g x) f(g(x)) f (g x) (h x) f(g(x), h(x)) f x y + 1 f(x, y) + 1 f x (y+1) f(x, y + 1) sqrt x + 1 x + 1 sqrt (x + 1) x + 1 Um operador pode ser usando como uma função escrevendo-o entre parêntesis Reciprocamente: uma função pode ser usada como operador escrevendo-a entre aspas esquerdas (+) x y = x+y (*) y 2 = y*2 x mod 2 = mod x 2 f x div n = div (f x) n O prelúdio-padrão (standard Prelude) O módulo Prelude contém um grande conjunto de funções pré-definidas: os operadores e funções aritméticas; funções genéricas sobre listas... e muitas outras. O prelúdio-padrão é automaticamente carregado pelo interpretador/compilador e pode ser usado em qualquer programa Haskell. Algumas funções do prelúdio > head [1,2,3,4] obter o 1 o elemento 1 > tail [1,2,3,4] remover o 1 o elemento [2,3,4] > length [1,2,3,4,5] comprimento 5 7

> take 3 [1,2,3,4,5] obter um prefixo [1,2,3] > drop 3 [1,2,3,4,5] remover um prefixo [4,5] > [1,2,3] ++ [4,5] concatenar [1,2,3,4,5] > reverse [1,2,3,4,5] inverter [5,4,3,2,1] > [1,2,3,4,5]!! 3 indexação 4 > sum [1,2,3,4,5] soma dos elementos 15 > product [1,2,3,4,5] produto dos elementos 120 Definir novas funções Vamos definir novas funções num ficheiro de texto Usamos um editor de texto externo (e.g. Emacs) O nome do ficheiro deve terminar em.hs (Haskell script) 2 Criar um ficheiro de definições Usando o editor, criamos um novo ficheiro test.hs: dobro x = x + x quadruplo x = dobro (dobro x) Usamos o comando :load para carregar estas definições no GHCi. $ ghci... > :load teste.hs [1 of 1] Compiling Main ( teste.hs, interpreted ) Ok, modules loaded: Main. 2 Alternativa:.lhs (literate Haskell script) 8

Exemplos de uso > dobro 2 4 > quadruplo 2 8 > take (quadruplo 2) [1..10] [1,2,3,4,5,6,7,8] Modificar o ficheiro Acrescentamos duas novas definições ao ficheiro: factorial n = product [1..n] media x y = (x+y)/2 No interpretador usamos :reload para carregar as modificações. > :reload... > factorial 10 3628800 > media 2 3 2.5 Comandos úteis do interpretador :load fich :reload :edit :set editor prog :type expr :help :quit carregar um ficheiro re-carregar modificações editar o ficheiro actual definir o editor mostrar o tipo duma expressão obter ajuda terminar a sessão Podem ser abreviados, e.g. :l em vez de :load. Sintaxe Nomes de funções e variáveis começam por letra minúscula, seguidos de letras, dígitos ou Indentação: numa sequência de definições, cada definição deve começar na mesma coluna, ou separada por ; Comentários... Encaixe de padrão... Definição com guards (guardas)... definições locais 9

Identificadores Os nomes de funções e argumentos devem começar por letras mínusculas e podem incluir letras, dígitos, sublinhados e apóstrofes: fun1 x_2 y foobar As seguintes palavras reservadas não podem ser usadas como identificadores: case class data default deriving do else if import in infix infixl infixr instance let module newtype of then type where Definições locais Podemos fazer definições locais usando where. a = b+c where b = 1 c = 2 d = a*2 A indentação indica o âmbito das declarações; também podemos usar agrupamento explícito. a = b+c where {b = 1; c = 2} d = a*2 Indentação Todas as definições num mesmo âmbito devem começar na mesma coluna. a = 1 b = 2 c = 3 ERRADO a = 1 b = 2 c = 3 ERRADO 10

a = 1 b = 2 c = 3 OK A ordem das definições não é relevante. Comentários Simples: começam por -- até ao final da linha Embricados: delimitados por {- e -} -- factorial de um número inteiro factorial n = product [1..n] -- média de dois valores media x y = (x+y)/2 {- ** as definiç~oes seguintes est~ao comentadas ** dobro x = x+x quadrado x = x*x -} Encaixe de padrão, if-then-else, guardas -- if-then-else zero x = if x == 0 then True else False -- Multiplas definicoes e wildcard zero 0 = True zero _ = False -- expressoes case zero x = case x of 0 -> True otherwise -> False -- guardas zero x x == 0 = True otherwise = False 11

Exercício: Escrever as funções seguintes 1. min3:: Int -> Int -> Int -> Int que calcula o mínimo de três inteiros 2. tresiguais:: Int -> Int -> Int -> Bool que determina se 3 inteiros são iguais 3. media:: Float -> Float -> Float que calcula a média de dois inteiros 4. par:: Int -> Bool que determina se um inteiro é par 5. sinal:: Int -> Int que determina o sinal de um determinado inteiro (ex: sinal 1 = 1 e sinal de -2 = -1). 12