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

Documentos relacionados
Programação Funcional

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

Funções de Ordem Superior

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

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

Paradigmas de Programação

Aula prática 14. Expressão Lambda

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

Funções de Ordem Superior

Programação Funcional Aula 1

Expressões Condicionais

Ambiente de desenvolvimento

Programação Funcional

Expressões Condicionais

Conceitos de Linguagens de Programação

Linguagem Haskell. Riocemar S. de Santana

Conceito de Linguagens de Programação - 1

Programação Funcional em Haskell

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

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

Instalação JDK. Joyce França. Professora de Ciência da Computação - IFNMG

Instalação JDK 10/03/2017

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

Obs.: para realizar estas atividades tenha certeza de que já tenha instalado no sistema operacional o Java JDK e o NetBeans.

Conhecendo a Linguagem de Programação C

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

Programação Funcional

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

Introdução à linguagem C

Programação Funcional Aulas 1 & 2

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

Material Didático Unificado.

Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I - BCC701

Aula 3. Objetivos Sequências de escapes ; Um aplicativo que adiciona inteiro; Aritmética.

Compilador de LP3 para C3E e P3

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

Compilação da linguagem Panda

Algoritmos e Programação

IDES E PROGRAMAÇÃO. Prof. Dr. Cláudio Fabiano Motta Toledo PAE: Maurício A Dias

Fundamentos da programação Parte - 1

Programação de Computadores:

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

Introdução ao software MatLab

Programação de Computadores III

ALGORITMOS AULA 2. Profª Amanda Gondim

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

Lógica de Programação I. Gilson de Souza Carvalho

SCS Sistemas de Controle / Servomecanismos. Aula 01 Introdução ao software MATLAB

Programação Funcional. Aula 3. Tipos e Classes. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Noçõ linguagem Java. Profs. Marcel Hugo e Jomi Fred Hübner. Departamento de Sistemas e Computação Universidade Regional de Blumenau - FURB

Programação de Computadores III

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

Esta é a única declaração da aplicação

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

Introdução ao Fortran 90-1

Programação: Vetores

Introdução ao Python. Programa Computacional

Linguagens de Programação Funcional

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Material Didático Unificado. Variáveis correspondem a nomes para endereços de memória que são gerenciados pelo Scilab.

Programação Funcional. Aula 6. Listas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Python - Variáveis e expressões

Introdução à Ciência da Computação

Puca Huachi Vaz Penna

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

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

Introdução ao SciLab. SciLab O que é? Onde obter o programa:

Programação I A Linguagem C. Prof. Carlos Alberto

INFORMÁTICA APLICADA AULA 03 ALGORITMOS

3. Linguagem de Programação C

Programação Básica. Estrutura de um algoritmo

ALGORITMOS E APLICAÇÕES. FATEC IPIRANGA ADS Noturno 1º semestre de 2012 Prof. Luiz Carlos de Jesus Junior

Programação Introdução

Puca Huachi Vaz Penna

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

Linguagem de Programação II Programação Orientada a Objetos. Ambientes de Programação

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

Paradigmas de Linguagens de Programação. Expressões e Instruções de Atribuição

Tipos de Dados Simples (Continuação)

Conceitos Básicos de Scripts

Programação Funcional. Capítulo 13. Mônadas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2012.

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

Inteligência Computacional Aula 2 - Introdução ao MatLab Graduação /2

O AMBIENTE DE DESENVOLVIMENTO

Introdução à Programação

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

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

PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95

Linguagem C Princípios Básicos (parte 1)

Portugol. Tiago Alves de Oliveira

Programação Funcional Aulas 5 & 6

Programas Interativos

Algoritmos I Aula 13 Linguagem de Programação Java

Introdução a Matrizes

Java e sua Sintaxe. Estrutura mínima de um programa em Java: public class Exemplo { }

Transcrição:

Programação Funcional Capítulo 2 Primeiros Passos José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2013.1 1/45

1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 2/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 3/45

Glasglow Haskell Compiler GHC é um compilador e um ambiente interativo para a linguagem funcional Haskell. GHC é um software livre, distribuído com a licença GPL. GHC suporta toda a linguagem Haskell 2010 mais uma grande variedade de extensões. GHC tem suporte particularmente bom para concorrência e paralelismo. GHC gera código rápido, principalmente para programas concorrentes. Dê uma olhada no desempenho GHC em The Computer Language Benchmarks Game. GHC funciona em várias plataformas, incluindo Windows, Mac, Linux, a maioria das variedades de Unix, e várias arquiteturas de processadores diferentes. GHC tem capacidades de otimização, incluindo otimização entre módulos. 4/45

Glasglow Haskell Compiler (cont.) GHC compila código Haskell diretamente para código nativo ou pode usar LLVM como um back-end, ou pode gerar código C como código intermediário para portar para novas plataformas. O ambiente interativo GHCi compila para bytecode (representação intermediária entre linguagem de alto nível e linguagem de máquina), e suporta a execução mista de bytecode e código nativo. GHC suporta profiling. GHC vem com várias bibliotecas. Muitas outras bibliotecas estão disponíveis no repositório Hackage. 5/45

Plataforma Haskell A Plataforma Haskell (http://www.haskell.org/platform/) é um ambiente de desenvolvimento abrangente e robusto para a programação em Haskell. A plataforma contém o compilador GHC e várias bibliotecas prontas para serem usadas. 6/45

O ambiente interativo ghci GHCi é um ambiente interativo do GHC em que expressões Haskell podem ser avaliadas de forma interativa e os programas podem ser interpretados. GHCi tem suporte para carregar código compilado de forma interativa, bem como apoio a todos as extensões de linguagem que GHC oferece. GHCi inclui um depurador interativo. O GHCi pode ser iniciado a partir do prompt simplesmente digitando ghci. Em um sistema Unix: $ ghci GHCi, version 7.4.1: http://www.haskell.org/ghc/ Loading package ghc-prim... linking... done. Loading package integer-gmp... linking... done. Loading package base... linking... done. Prelude> :? for help 7/45

O ambiente interativo ghci (cont.) O prompt > significa que o sistema ghci está pronto para avaliar expressões. À esquerda do prompt é mostrada a lista de módulos abertos. Expressões Haskell podem ser digitadas no prompt. Por exemplo: Prelude> 2 + 3 * 4 14 Prelude> (2 + 3) * 4 20 Prelude> sqrt (3^2 + 4^2) 5.0 8/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 9/45

Módulos Programas em Haskell são organizados em módulos. Um módulo é formado por um conjunto de definições (tipos, variáveis, funções, etc.). Para que as definições de um módulo possam ser usadas em um programa, o módulo deve ser importado. A biblioteca padrão é formada por um conjunto de módulos disponível para todas os programas em Haskell. A Plataforma Haskell inclui várias bibliotecas adicionais. Além das bibliotecas padrão, estão disponíveis vários outros módulos que podem ser instalados separadamente. 10/45

standard prelude O arquivo de biblioteca Prelude.hs oferece um grande número de funções definidas no padrão da linguagem através do módulo Prelude. O módulo Prelude é importado automaticamente em todos os módulos de uma aplicação Haskell. O módulo Prelude oferece várias funções para manipulação de números e outros dados. Todas as definições do módulo Prelude podem ser listadas usando o seguinte comando no GHCi: Prelude> :browse Prelude 11/45

standard prelude (cont.) Normalmente uma aplicação de função usa a notação prefixa: escreve-se a função seguida dos argumentos. Exemplos: Prelude> negate 78-78 Prelude> abs (-7412) 7412 Prelude> sqrt 2.56 1.6 Prelude> cos pi -1.0 Prelude> log 100 4.605170185988092 Prelude> exp 2.0 7.38905609893065 Prelude> sqrt (abs (- 16)) 4.0 12/45

standard prelude (cont.) No entanto algumas funções são definidas como operadores binários infixos. Os operadores binários apresentam a precedência e associatividade usuais da Matemática. O módulo Prelude oferece as funções aritméticas familiares, como +, -, *, div, mod, /. Exemplos: Prelude> 7 * 8 56 Prelude> 1 + 2 * 3 7 Prelude> (1 + 2) * 3 9 Prelude> div (7*8) 3 18 Prelude> mod (7*8) 3 2 Prelude> (7*8) / 3 18.666666666666668 13/45

standard prelude (cont.) Além das funções aritméticas, o módulo Prelude também oferece muitas funções úteis para a manipulação de listas e outras estruturas de dados. Uma lista pode ser escrita como uma sequência de expressões separadas por vírgula e delimitada por colchetes. Exemplo: Prelude> [12, div 78 10, 0, 5-9] [12,7,0,-4] Prelude> [] [] 14/45

standard prelude (cont.) null: verifica se uma lista é vazia: Prelude> null [] True Prelude> null [1,2,3,4,5] False 15/45

standard prelude (cont.) head: seleciona a cabeça (primeiro elemento) de uma lista: Prelude> head [1,2,3,4,5] 1 Prelude> head [] *** Exception: Prelude.head: empty list tail: seleciona a cauda da lista, ou seja, uma lista formada por todos os elementos exceto o primeiro: Prelude> tail [1,2,3,4,5] [2,3,4,5] Prelude> tail [5*4, 6*5] [30] Prelude> tail [8-1] [] Prelude> tail [] *** Exception: Prelude.tail: empty list 16/45

standard prelude (cont.) lenght: calcula o tamanho de uma lista: Prelude> length [1,2,3,4,5] 5 Prelude> length [] 0 (!!): seleciona o n-ésimo elemento de uma lista (0 n < len, onde len é o comprimento da lista): Prelude> [1,2,3,4,5]!! 2 3 Prelude> [1,2,3,4,5]!! 0 1 Prelude> [1,2,3,4,5]!! 10 *** Exception: Prelude.(!!): index too large Prelude> [1,2,3,4,5]!! (-4) *** Exception: Prelude.(!!): negative index 17/45

standard prelude (cont.) take: seleciona os primeiros n elementos de uma lista: Prelude> take 3 [1,2,3,4,5] [1,2,3] drop: remove os primeiros n elementos de uma lista: Prelude> drop 3 [1,2,3,4,5] [4,5] 18/45

standard prelude (cont.) sum: calcula a soma dos elementos de uma lista de números: Prelude> sum [1,2,3,4,5] 15 product: calcula o produto dos elementos de uma lista de números: Prelude> product [1,2,3,4,5] 120 19/45

standard prelude (cont.) (++): concatena duas listas: Prelude> [1,2,3] ++ [4,5] [1,2,3,4,5] reverse: inverte uma lista: Prelude> reverse [1,2,3,4,5] [5,4,3,2,1] 20/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 21/45

Applicação de função Em Matemática, aplicação de função é denotada usando parênteses, e a multiplicação é muitas vezes denotada usando justaposição ou espaço. Exemplo: f(a,b) + cd aplica a função f aos argumentos a e b, e adiciona o resultado ao produto de c e d. Em Haskell, a aplicação de função é denotada usando o espaço, e a multiplicação é indicada pelo operador *. Exemplo: f a b + c * d aplica a função f aos argumentos a e b, e adiciona o resultado ao produto de c e d. 22/45

Applicação de função (cont.) Aplicação de função tem precedência maior do que todos os outros operadores. Assim f a + b significa (f a) + b em vez de f (a + b) 23/45

Applicação de função (cont.) Exemplos: Matemática Haskell f(x) f x f(x,y) f x y f(g(x)) f (g x) f(x,g(y)) f x (g y) f(x)g(y) f x * g y 24/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 25/45

Scripts Haskell Além de poder usar as funções do prelúdio, o programador pode também definir e usasr suas próprias funções. Novas funções são definidas dentro de um script, um arquivo texto compreendendo uma seqüência de definições. Por convenção, scripts Haskell normalmente têm a extensão.hs em seu nome. Isso não é obrigatório, mas é útil para fins de identificação. 26/45

Meu primeiro script Ao desenvolver um script Haskell, é útil manter duas janelas abertas, uma executando um editor para editar o script, e outra para o ambiente interativo (GHCi) em execução. Exemplo: Inicie um editor de texto, digite as seguintes definições de função, e salve o script com o nome test.hs: double x = x + x quadruple x = double (double x) 27/45

Meu primeiro script (cont.) Deixando o editor aberto, em outra janela execute o GHCi com o novo script: $ ghci test.hs GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim... linking... done. Loading package integer-gmp... linking... done. Loading package base... linking... done. [1 of 1] Compiling Main ( test.hs, interpreted ) Ok, modules loaded: Main. *Main> 28/45

Meu primeiro script (cont.) Agora, tanto Prelude.hs como test.hs são carregados, e funções de ambos os scripts podem ser usadas: *Main> quadruple 10 40 *Main> take (double 2) [1,2,3,4,5,6] [1,2,3,4] 29/45

Meu primeiro script (cont.) Deixando o GHCi aberto, volte para o editor, adicione as seguintes definições ao script test.hs, e salve: factorial n = product [1..n] average ns = div (sum ns) (length ns) 30/45

Meu primeiro script (cont.) GHCi não detecta automaticamente que o script foi alterado. Assim um comando reload deve ser executado para que as novas definições possam ser usadas: *Main> :reload [1 of 1] Compiling Main ( test.hs, interpreted ) Ok, modules loaded: Main. *Main> factorial 10 3628800 *Main> factorial 50 30414093201713378043612608166064768844377641568960512000000000000 *Main> average [1,2,3,4,5] 3 31/45

Meu primeiro script (cont.) A aplicação de uma função de dois argumentos pode ser escrita usando a notação de operador infixo: basta escrever o nome da função entre aspas invertidas (crase) Exemplo: average ns = sum ns div length ns Observe que div é colocado entre aspas simples invertidas (crase) x f y é apenas uma abreviação sintática para f x y. 32/45

Identificadores Nomes de função e variáveis devem começar com uma letra minúscula e podem conter letras, dígitos, sublinhado e apóstrofo (aspa simples). Exemplos: myfun fun1 arg_2 x Por convenção, uma lista de elementos normalmente têm um sufixo s em seu nome, que indica plural. Exemplos: xs ns nss 33/45

Comentários Comentários são usados para fazer anotações no programa que podem ajudar a entender o funcionamento do mesmo. Os comentários são ignorados pelo compilador. Comentário de linha: é introduzido por -- e se estendem até o final da linha. Comentário de bloco: é delimitado por {- e -}. Pode ser aninhado. 34/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 35/45

A regra de layout Em uma seqüência de definições, cada definição deve começar precisamente na mesma coluna: a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 36/45

A regra de layout (cont.) Se uma definição for escrita em mais de uma linha, as linhas subsequentes à primeira devem começar em uma coluna mais à direita da coluna que caracteriza a sequência de definições. a = 10 + 20 + 30 + 40 + 50 + 60 b = product [10,20,30] a = 10 + 20 + 30 + 40 + 50 + 60 b = product [10,20,30] 37/45

A regra de layout (cont.) A regra de layout evita a necessidade de uma sintaxe explícita para indicar o agrupamento de definições usando {, } e ; {- agrupamento implícito -} a = b + c where b = 1 d = a * 2 significa c = 2 {- agrupamento explícito -} a = b + c d = a * 2 where { b = 1 ; c = 2 } 38/45

A regra de layout (cont.) Para evitar problemas com a regra de layout, é recomendado não utilizar caracteres de tabulação para indentação do código fonte, uma vez que um único caracterizar de tabulação pode ser apresentado na tela como vários espaços. O texto do programa vai aparentar estar alinhado na tela do computador, mas na verdade pode não estar devido ao uso do tabulador. No editor notepad++ você deve desabilatar o uso de tabulação. Para tanto marque a opção para substituir tabulações por espaço, acessando o menu Configurações -> Preferências -> Menu de Linguagens/Configuração de Abas -> Substituir por espaço antes de editar o arquivo. 39/45

Tópicos 1 Glasgow Haskell Compiler 2 Bibliotecas padrão 3 Aplicação de função 4 Scripts 5 Regra de layout 6 Comandos úteis do GHCi 40/45

Comandos úteis do GHCi comando abrev significado :load name :l carrega o script name :reload :r recarrega o script atual :edit name :e edita o script name :edit :e edita o script atual :type expr :t mostra o tipo de expr :info name :i dá informações sobre name :browse Name dá informações sobre o módulo Name, se ele estiver carregado let id = exp associa a variável id ao valor da expressão exp :! comando executa comando do sistema :help :h, :? lista completa dos comandos do GHCi :quit :q termina o GHCi 41/45

Exercícios Exercício 1 Experimente os exemplos apresentados nos slides usando o GHCi. Exercício 2 Identifique e orrija os erros de sintaxe no script que se segue, e teste sua solução usando o GHCi. N = a div length xs where a = 10 xs = [1,2,3,4,5] 42/45

Exercícios (cont.) Exercício 3 Defina uma função para calcular o quadrado do dobro do seu argumento. Teste sua função no GHCi. Exercício 4 Defina uma função para calcular o dobro do quadrado do seu argumento. Teste sua função no GHCi. 43/45

Exercícios (cont.) Exercício 5 Mostre como a função de biblioteca last que seleciona o último elemento de uma lista não vazia pode ser definida usando as funções do prelúdio introduzidas neste capítulo. Exercício 6 Você pode pensar em outra possível definição para a função last? Exercício 7 Da mesma forma, mostrar como a função de biblioteca init, que remove o último elemento de uma lista não vazia pode ser definida de duas maneiras diferentes. 44/45

Fim 45/45