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



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

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

Programação Funcional. Aula 5. Funções Recursivas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

TRABALHO DE PROGRAMAÇÃO FUNCIONAL LINGUAGEM DE PROGRAMAÇÃO I

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 14 PROFª BRUNO CALEGARO

Programação Funcional. Aula 4. Definindo Funções. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Computação II Orientação a Objetos

Construção de Compiladores. Capítulo 1. Introdução. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2014.

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

Uma expressão básica em SQL consiste em três cláusulas: select, from e where.

Software Básico. Conceito de Linguagem de Máquina e Montagem: introdução ao Assembly. Prof. MSc. Hugo Vieira L. Souza

DALUA: BIBLIOTECA PARA APLICAÇÕES DISTRIBUÍDAS

ALGORITMOS MEMÓRIA, VARIÁVEIS E CONSTANTES, OPERADORES Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Programação científica C++

Introdução a Programação Funcional

Estruturas de Repetição

DAS5102 Fundamentos da Estrutura da Informação

Linguagem Funcional Haskell

1 INTRODUÇÃO 1.1 CONCEITO DE PARADIGMAS DE LINGUAGEM DE PROGRAMAÇÃO PARADIGMAS DE LINGUAGEM DE PROGRAMAÇÃO

2 Ferramentas Utilizadas

UNEMAT SISTEMA DE INFORMAÇÃO (SI) Professora: Priscila Pelegrini

Engenharia de Software II

Figure 2 - Nós folhas de uma árvore binária representando caracteres ASCII

- Aulas 57, 58, 59 e 60 - Técnicas de programação. Funções

Faculdade de Computação

Linguagem algorítmica: Portugol

5. Uma lousa denominada EPI (registrador de endereço de próxima instrução).

ADMINISTRAÇÃO GERAL GESTÃO DE PROCESSOS

CAPÍTULO 1. O QUE É O ArcGIS 8.3. O Sistema de Informações Geográficas ArcGIS é constituído de três partes:

UNIDADE 6 - PROGRAMAÇÃO MODULAR

2. Conceitos e Arquitetura de Bancos de Dados

Teclado. Mike McBride Anne-Marie Mahfouf Tradução: Lisiane Sztoltz

Serviços Web: Arquitetura

TRABALHO PRÁTICO Nro. 02 (Atualizado em 29/10/2008)

Linguagens de Programação Aula 10

Algoritmos e Programação Parte Teórica

Arquitetura de Computadores Moderna

Dadas a base e a altura de um triangulo, determinar sua área.

MODELAGEM E SIMULAÇÃO

Linguagens de Programação

Matemática Discreta para Computação e Informática

9 Comandos condicionais

O modelo Entidade-Relacionamento. Agenda: -Modelagem de dados utilizando O Modelo Entidade-Relacionamento

Um jogo de preencher casas

ALGORITMOS E FLUXOGRAMAS

Engenharia de Software II

PESQUISA EM INFORMÁTICA -ESTILOS DE PESQUISA EM COMPUTAÇÃO. Prof. Angelo Augusto Frozza, M.Sc.

Neste tópico, veremos como selecionar e copiar informações entre bancos de dados de empresa no SAP Business One.

Sistemas Operacionais. Curso Técnico Integrado Profa: Michelle Nery

Linguagem de Programação I

Aula 2 Revisão 1. Ciclo de Vida. Processo de Desenvolvimento de SW. Processo de Desenvolvimento de SW. Processo de Desenvolvimento de SW

Introdução às Bases de Dados

Influenciam nossa percepção; ajudam-nos a organizar e a coordenar a Classes estimulam projeto centrado em dados:


Programação: Estruturas de seleção

15 a Aula Subprogramação /Subalgoritmos Função e Procedimento

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

Algoritmos e Técnicas de

Potência, uma coisa mais que complicada Parte V

Linguagens de. Aula 01. Profa Cristiane Koehler

Programação: Tipos, Variáveis e Expressões

Abstrações e Tecnologias Computacionais. Professor: André Luis Meneses Silva /msn: andreluis.ms@gmail.com Página: orgearq20101.wordpress.

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

DESENVOLVIMENTO DE SOFTWARE

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

Pontifícia Universidade Católica de São Paulo Departamento de Ciência da Computação

Introdução a Banco de Dados Aula 03. Prof. Silvestri

Projuris Enterprise Visão Geral da Arquitetura do Sistema

1 Introdução. Componentes Usuários. Provedor de Serviços. Figura 1.1 Ambiente de oferecimento de serviços

Desmistificando o Programa de Computador

LÓGICA DE PROGRAMAÇÃO. Professor Celso Masotti

Linguagem de Programação

Programação Funcional

Exercícios de Revisão Java Básico

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

Algoritmos DCC 119. Introdução e Conceitos Básicos

Hashing (Tabela de Dispersão)

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO DEPARTAMENTO DE ESTATÍSTICA E INFORMÁTICA BACHARELADO EM SISTEMAS DE INFORMAÇÃO RAPID APPLICATION DEVELOPMENT

WINDOWS EXPLORER. O organizador

Curso de Especialização em Tecnologia da Informação. Engenharia de Software

Métodos de Construção de Software: Orientação a Objetos. Mestrado em Ciência da Computação 2008 Profa. Itana Gimenes

Programação Orientada a Objeto

Administração de Pessoas

Prof. Antonio Almeida de Barros Jr. Prof. Antonio Almeida de Barros Junior

Capítulo 3 Projeto de Arquitetura

Ambiente de Simulação Virtual para Capacitação e Treinamento na Manutenção de. Disjuntores de Subestações de Energia Elétrica,

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Tencologia em Análise e Desenvolvimento de Sistemas Disciplina: WEB I Conteúdo: Arquitetura de Software Aula 03

Definição de Programas de Computadores e Linguagem de Programação de Comutadores

CADERNOS DE INFORMÁTICA Nº 1. Fundamentos de Informática I - Word Sumário

ITIL v3 - Operação de Serviço - Parte 1

Análise e Projeto Orientados por Objetos

KF2.4 MANUAL DE UTILIZADOR

Lógica Proposicional

Conceitos básicos da linguagem C

Tema 1: Modelo Estático

Transcrição:

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

1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 2/37

Tópicos 1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 3/37

A Crise do Software Dificuldades encontradas: como... lidar com o tamanho e a complexidade dos programas de computador modernos? reduzir o tempo e o custo de desenvolvimento do programas? aumentar nossa confiança de que os programas já concluídos funcionam corretamente? 4/37

Linguagens de Programação Uma abordagem para a crise do software é a concepção de novas linguagens de programação que: permitam que programas sejam escritos de forma clara, concisa, e com um alto nível de abstração; suportem componentes de software reutilizáveis; incentivem o uso de verificação formal; permitam prototipagem rápida; forneçam poderosas ferramentas de resolução de problemas. 5/37

Linguagens funcionais As linguagens funcionais oferecem um quadro particularmente elegante para abordar estes objetivos. Abordaremos a linguagem funcional Haskell. 6/37

Função Função é um mapeamento que associa cada valor de um domínio (argumento) a um único valor de um contra-domínio (resultado). O mapeamento é estabelecido por uma lei de associação, expressa por um algoritmo. Em Haskell uma função é definida usando uma ou mais equações. Uma equação dá um nome para a função, um nome para cada um de seus argumentos, e um corpo que especifica como o resultado pode ser calculado em termos dos argumentos. Exemplo: Uma função chamada dobro que recebe um número x como argumento, e produz o resultado x + x: dobro x = x + x 7/37

Aplicação de função Quando uma função é aplicada aos argumentos atuais, o resultado é obtido pela substituição desses argumentos no corpo da função no lugar dos nomes dos argumentos. Este processo pode produzir imediatamente um resultado que não pode ser mais simplificado, como por exemplo um número. Mais comumente, no entanto, a substituição produz uma expressão contendo outras aplicações de função, que devem, então, ser processadas da mesma maneira para produzir o resultado final. 8/37

Aplicação de função (cont.) Exemplo: Aplicação da função dobro no argumento 3 dobro 3 = { aplicando dobro } 3 + 3 = { aplicando + } 6 9/37

Aplicação de função (cont.) Exemplo: Aplicação aninhada de dobro dobro (dobro 2) = { aplicando dobro interno } dobro (2 + 2) = { aplicando + } dobro 4 = { aplicando dobro } 4 + 4 = { aplicando + } 8 10/37

Aplicação de função (cont.) Exemplo: Aplicação aninhada de dobro, calculada de outra maneira dobro (dobro 2) = { aplicando dobro externo } dobro 2 + dobro 2 = { aplicando o primeiro dobro } (2 + 2) + dobro 2 = { aplicando o primeiro + } 4 + dobro 2 = { aplicando dobro } 4 + (2 + 2) = { aplicando o segundo + } 4 + 4 = { aplicando + } 8 11/37

Aplicação de função (cont.) Em geral, a ordem na qual funções são aplicadas em um cálculo não afeta o valor do resultado final, mas pode afetar o número de passos necessário, e pode determinar se o processo de cálculo termina ou não termina. 12/37

O que é uma linguagem funcional? As opiniões divergem, e é difícil dar uma definição precisa, mas de um modo geral: Programação funcional é um estilo de programação em que o método básico de computação é a aplicação de funções a argumentos. Uma linguagem funcional é aquela que apoia e incentiva o estilo funcional. 13/37

O que é uma linguagem funcional? (cont.) Exemplo: Somando os inteiros 1 a 10 em C: int total = 0; for (int i = 1; i <= 10; ++i) total = total + i; O método de cálculo é atribuição de variável. Em geral, linguagens de programação em que o método básico de computação consiste em mudar os valores armazenados em variáveis são chamadas de linguagens imperativas, pois os programas nestas linguagens são construídos a partir de instruções imperativas que especificam precisamente como o cálculo deve ser realizado. 14/37

O que é uma linguagem funcional? (cont.) Exemplo: Somando os inteiros 1 a 10 em Haskell: sum [1..10] O método de cálculo é aplicação de função. 15/37

Tópicos 1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 16/37

Algumas características de Haskell Programas concisos Sistema de tipos poderoso Compreensões de lista Funções recursivas Funções de ordem superior Computações monádicas Avaliação lazy Maior facilidade de raciocínio sobre programas 17/37

Tópicos 1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 18/37

Antecedentes históricos Década de 1930: Alonzo Church desenvolve o cálculo lambda, uma teoria de funções simples, mas poderosa. 19/37

Antecedentes históricos (cont.) Década de 1950: John McCarthy desenvolve Lisp, a primeira linguagem funcional, com algumas influências do cálculo lambda, mas mantendo as atribuições de variáveis. 20/37

Antecedentes históricos (cont.) Década de 1960: Peter Landin desenvolve ISWIM, a primeira linguagem funcional pura, baseada fortemente no cálculo lambda, sem atribuições. 21/37

Antecedentes históricos (cont.) Década de 1970: John Backus desenvolve FP, uma linguagem funcional que enfatiza funções de ordem superior e raciocínio sobre programas. 22/37

Antecedentes históricos (cont.) Década de 1970: Robin Milner e outros desenvolvem ML, a primeira linguagem funcional moderna, que introduziu a inferência de tipos e tipos polimórficos. 23/37

Antecedentes históricos (cont.) Décadas de 1970 e 1980: David Turner desenvolve uma série de linguagens funcionais com avaliação lazy, culminando com o sistema Miranda. 24/37

Antecedentes históricos (cont.) 1987: Um comitê internacional de pesquisadores inicia o desenvolvimento de Haskell, uma linguagem funcional lazy padrão. 25/37

Antecedentes históricos (cont.) 2003: O comitê publica o relatório Haskell 98, a definição de uma versão estável da linguagem Haskell. 26/37

Antecedentes históricos (cont.) 2009: O comitê publica o relatório Haskell 2010, uma revisão da definição da linguagem Haskell. 27/37

Tópicos 1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 28/37

Quem usa Haskell? Exemplos de empresas que usam Haskell: AT&T automatização de processamento de formulários Bank of America Merril Lynch transformação de dados Bump servidores baseados em Haskell Facebook manipulação da base de código PHP Google infra-estrutura interna de TI MITRE análise de protocolos de criptografia NVIDIA ferramentas usadas internamente Qualcomm, Inc geração de interfaces de programação para Lua Para maiores detalhes veja Haskell in industry: http://www.haskell.org/haskellwiki/haskell_in_industry. 29/37

Tópicos 1 Programação Funcional 2 Algumas características de Haskell 3 Antecedentes históricos 4 Algumas empresas que usam Haskell 5 Experimentando Haskell 30/37

Experimentando Haskell sum :: Num a => [a] -> a sum [] = 0 sum (x:xs) = x + sum xs sum [1, 2, 3] = { aplicando sum } 1 + sum [2, 3] = { aplicando sum } 1 + (2 + sum [3]) = { aplicando sum } 1 + (2 + (3 + sum [])) = { aplicando sum } 1 + (2 + (3 + 0)) = { aplicando + } 6 31/37

Experimentando Haskell (cont.) f [] = [] f (x:xs) = f ys ++ [x] ++ f zs where ys = [a a <- xs, a <= x] zs = [b b <- xs, b > x]? 32/37

Experimentando Haskell (cont.) f [x] = { aplicando f } f [] ++ [x] ++ f [] = { aplicando f } [] ++ [x] ++ [] = { aplicando ++ } [x] 33/37

Experimentando Haskell (cont.) f [3, 5, 1, 4, 2] = { aplicando f } f [1, 2] ++ [3] ++ f [5, 4] = { aplicando f } (f [] ++ [1] ++ f [2]) ++ [3] ++ (f [4] ++ [5] ++ f []) = { aplicando f, propriedade anterior } ([] ++ [1] ++ [2]) ++ [3] ++ ([4] ++ [5] ++ []) = { aplicando ++ } [1, 2] ++ [3] ++ [4, 5] = { aplicando ++ } [1, 2, 3, 4, 5] 34/37

Experimentando Haskell (cont.) O tipo de f é f :: Ord a => [a] -> [a] Dada uma lista xs, f xs é a lista formada pelos elementos de xs em ordem crescente. f implementa o algoritmo de ordenação quick sort. 35/37

Exercícios Exercício 1 Dê outro cálculo possível para o resultado de dobro (dobro 2). Exercício 2 Mostre que sum [x] = x para qualquer número x. Exercício 3 Defina uma função product que produza o produto de uma lista de números, e mostre, usando sua definição, que product [2,3,4] = 24 Exercício 4 Mostre como a definição da função qsort deve ser modificada para que ela produza uma versão de uma lista ordenada em ordem decrescente. Exercício 5 Qual é o efeito de trocar <= por < na definição de qsort? Dica: considere o exemplo qsort [2,2,3,1,1]. 36/37

Fim 37/37