Paradigmas de Programação

Documentos relacionados
Programação Funcional

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

Programação Funcional 9 a Aula Programas interativos

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

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

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

Puca Huachi Vaz Penna

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

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

Programação Funcional Aula 1

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

3. Linguagem de Programação C

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

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Aula prática 14. Expressão Lambda

Programação de Computadores III

11 - Estrutura de um programa em C

Algoritmos I Aula 13 Linguagem de Programação Java

Programação de Computadores III

Programação Funcional

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:

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

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

Programação Estruturada

INTRODUÇÃO AO JAVA PARA PROGRAMADORES C

Teoria da Computação e Algoritmos. Introdução à Linguagem Pascal. ALGORITMO <Nome do algoritmo>; <definições>; INÍCIO <Comandos>; FIM.

Algoritmos e Programação

Linguagens de Programação Aula 13

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

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

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

Paradigmas de Programação

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Python - Variáveis e expressões

Descobrindo Lua. Sérgio Queiroz de Medeiros. Campus Party LabLua. Sérgio Queiroz de Medeiros Descobrindo Lua 1

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

Linguagem de Programação C

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

Tipos de Dados Simples (Continuação)

Aula 03: Introdução a C

Lista de Exercícios - 1 Prof: Yuri Frota

Material Didático Unificado.

Ambiente de desenvolvimento

Linguagens de Programação Funcional

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

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

Principais paradigmas de programação. Programação imperativa Programação funcional Programação lógica Programação OO

3. Linguagem de Programação C

Computação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa

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

4. Constantes. Constantes pré-definidas

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

Linguagem C: Introdução

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

Aula de hoje. Tipos de Dados e Variáveis. Constantes literais. Dados. Variáveis. Tipagem dinâmica. SCC Introdução à Programação para Engenharias

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

Instituto Superior de Engenharia de Lisboa

Linguagens de Programação

ALGORITMOS AULA 2. Profª Amanda Gondim

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

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Introdução ao Scilab. Comandos de entrada e saída de dados.

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

Aula 03 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Programação Funcional. Aula 10. Parsers. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto /74 ...

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

Simulação de Caixa Automático

Introdução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

INFORMÁTICA PARA ENGENHARIA INTRODUÇÃO À PROGRAMAÇÃO COM PYTHON

Instituto Federal de Educação, Ciência e Tecnologia do Rio Grande do Norte Lista de Exercícios para a Terceira Unidade

Unidade 5: Introdução à Programação com Python Prof. Daniel Caetano

Material Didático Unificado.

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

Processamento da Informação

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Linguagem Python. Inteligência Artificial. Características de Python. Importando módulos. Módulos. Usando Python no modo interativo

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

Programação Orientada a Objetos II Java Segunda aula. Prof. Rogério Albuquerque de Almeida

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

Parte 1. Programação (linguagem C) Introdução Geral

Revisão da Linguagem C Prof. Evandro L. L. Rodrigues

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Segundo programa: media.c

Conceitos Básicos Linguagem C

Funções de Ordem Superior

Programação Funcional Aulas 9, 10 & 11

Linguagem de Programação C. Prof. Fabrício Olivetti de França

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

Processamento da Informação

Noções de algoritmos - Aula 1

Universidade Federal do Espírito Santo. Programação II. CT IX - Sala 206 Departamento de Informática Centro Tecnológico

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Transcrição:

Paradigmas de Programação Fabrício Olivetti de França 05 de Junho de 2018 1

Paradigmas de Programação 2

Paradigmas de Programação Haskell 3

Haskell Surgiu em 1990 com o objetivo de ser a primeira linguagem puramente funcional. Por muito tempo considerada uma linguagem acadêmica. Atualmente é utilizada em diversas empresas (totalmente ou em parte de projetos). 4

Haskell: Características Por ter sido criada por um comitê de estudiosos de linguagem de programação funcional e com a mentalidade de mantê-la útil para o ensino e pesquisa de linguagem de programação, assim como uso em empresas, a linguagem adquiriu diversas características distintas e interessantes não observadas em outras linguagens. 5

Haskell: Características Códigos concisos e declarativos: o programador declara o que ele quer ao invés de escrever um passo-a-passo. Programas em Haskell chegam a ser dezenas de vezes menores que em outras linguagens. take 100 [x x <- N, primo x] 6

Haskell: Características Sistema de tipagem forte: ao contrário de linguagens como Java e C, as declarações de tipo no Haskell são simplificadas (e muitas vezes podem ser ignoradas), porém, seu sistema rigoroso permite que muitos erros comuns sejam detectados em tempo de compilação. int x = 10; double y = 5.1; System.out.println("Resultado: " + (x*y)); OK! 7

Haskell: Características Sistema de tipagem forte: ao contrário de linguagens como Java e C, as declarações de tipo no Haskell são simplificadas (e muitas vezes podem ser ignoradas), porém, seu sistema rigoroso permite que muitos erros comuns sejam detectados em tempo de compilação. x = 10 :: Int y = 5.1 :: Double print ("Resultado: " + (x*y) ) ERRO! 8

Haskell: Características Compreensão de listas: listas são frequentemente utilizadas para a solução de diversos problemas. O Haskell utiliza listas como um de seus conceitos básicos permitindo uma notação muito parecida com a notação de conjuntos na matemática. xs = {x x N, x impar} xs = [x x <- N, impar x] 9

Haskell: Características Imutabilidade: não existe um conceito de variável, apenas nomes e declarações. Uma vez que um nome é declarado com um valor, ele não pode sofrer alterações. x = 1.0 x = 2.0 ERRO! 10

Haskell: Características Funções Recursivas: com a imutabilidade, o conceito de laços de repetição também não existe em linguagens funcionais. Eles são implementados através de funções recursivas. int x = 1; for (int i = 1; i <= 10; i++) { x = x*2; } 11

Haskell: Características Funções Recursivas: com a imutabilidade, o conceito de laços de repetição também não existe em linguagens funcionais. Eles são implementados através de funções recursivas. f 0 = 1 f n = 2 * f (n-1) print (f 1 10) 12

Haskell: Características Funções de alta ordem: funções podem receber funções como parâmetros. Isso permite definir funções genéricas, compor duas ou mais funções e definir linguagens de domínio específicos (ex.: parsing). print (aplique dobro [1,2,3,4]) > [2,4,6,8] 13

Haskell: Características Tipos polimórficos: permite definir funções genéricas que funcionam para classes de tipos. Por exemplo, o operador de soma + pode ser utilizado para qualquer tipo numérico. 1 + 2 -- 3 1.0 + 3.0 -- 4.0 (2%3) + (3%6) -- (7%6) 14

Haskell: Características Avaliação preguiçosa: ao aplicar uma função, o resultado será computado apenas quando requisitado. Isso permite evitar computações desnecessárias, estimula uma programação modular e permite estruturas de dados infinitos. listainf = [1..] -- 1, 2, 3,... print (take 10 listainf) 15

Haskell: Características Raciocínio equacional: podemos usar expressões algébricas para otimizar nosso programa ou provar sua corretude. muito cedo para dar um exemplo 16

Ambiente de Programação 17

GHC e GHCi Glasgow Haskell Compiler: compilador de código aberto para a linguagem Haskell. Possui um modo interativo ghci (similar ao ipython). 18

Glasgow Haskell Compiler Uso recomendado de: Git - controle de revisão Stack - gerenciamento de projeto e dependências Haddock - documentação 19

Instalação https://www.haskell.org/downloads#platform Para o Linux escolha a distribuição Generic, mesmo que tenha pacote para sua distribuição. 20

Editor recomendado Atom com os pacotes: haskell-grammar language-haskell 21

Interpretador GHCi $ ghci > 2+3*4 14 > (2+3)*4 20 > sqrt (3^2 + 4^2) 5.0 22

Interpretador GHCi O operador de exponenciação (ˆ) tem prioridade maior do que o de multiplicação e divisão (*,/) que por sua vez tem prioridade maior que a soma e subtração (+,-). $ ghci > 2+3*4^5 == 2 + (3 * (4^5)) 23

Informação de operadores Para saber a prioridade de um operador basta digitar: > :i (+) class Num a where (+) :: a -> a -> a... -- Defined in GHC.Num infixl 6 + A informação indica que + é um operador que pode ser utilizado para qualquer tipo numérico, tem precedência nível 6 (quanto maior o número maior sua prioridade) e é associativo a esquerda. Ou seja: 1 + 2 + 3 vai ser computado na ordem (1 + 2) + 3. 24

Funções Na matemática a aplicação de funções em seus argumentos é definido pelo nome da função e os parâmetros entre parênteses. A expressão f(a, b) + c d representa a aplicação de f nos parâmetros a, b e, em seguida, a soma do resultado com o resultado do produto entre c, d. No Haskell, a aplicação de função é definida como o nome da função seguido dos parâmetros separados por espaço com a maior prioridade na aplicação da função. O exemplo anterior ficaria: f a b + c*d 25

Funções A tabela abaixo contém alguns contrastes entre a notação matemática e o Haskell: Matemática f(x) f(x, y) Haskell f x 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 26

Hello World Criem um arquivo teste.hs, abram no editor e no mesmo diretório iniciem o GHCi. No arquivo digitem: dobra x = x + x quadruplica x = dobra (dobra x) 27

Hello World No GHCi: > :l teste.hs > quadruplica 10 40 O comando :l carrega as definições contidas em um arquivo fonte. 28

Hello World Acrescentem a seguinte linha no arquivo fonte: fatorial n = product [1..n] e no GHCi: > :reload > fatorial 5 120 29

Outros comandos do GHCi O comando :t mostra o tipo da função enquanto o comando :q sai do ghci. > :t dobra dobra :: Num a => a -> a > :q $ 30

Convenções 31

Requisitos dos nomes Os nomes das funções e seus argumentos devem começar com uma letra minúscula e seguida por 0 ou mais letras, maiúsculas ou minúsculas, dígitos, underscore, e aspas simples: funcao, ordenalista, soma1, x 32

Nomes reservados Os únicos nomes que não podem ser utilizados são: case, class, data, default, deriving do, else, foreign, if, import, in infix, infixl, infixr, instance, let module, newtype, of, then, type, where 33

Convenção para listas As listas são nomeadas acrescentando o caractere s ao nome do que ela representa. Uma lista de números n é nomeada ns, uma lista de variáveis x se torna xs. Uma lista de listas de caracteres tem o nome css. 34

Regra de layout O layout dos códigos em Haskell é similar ao do Python, em que os blocos lógicos são definidos pela indentação. f x = a*x + b where a = 1 b = 3 z = f 2 + 3 A palavra-chave where faz parte da definição de f, da mesma forma, as definições de a, b fazem parte da cláusula where. A definição de z não faz parte de f. 35

Tabs vs Espaço A definição de tabulação varia de editor para editor. Como o espaço é importante no Haskell, usem espaço ao invés de tab. 36

Comentários Comentários em uma linha são demarcados pela sequência, comentários em múltiplas linhas são demarcados por {- e -}: -- função que dobra o valor de x dobra x = x + x {- dobra recebe uma variável numérica e retorna seu valor em dobro. -} 37

Primeiro Projeto 38

Primeiro projeto compilável Para criar projetos, utilizaremos a ferramenta stack. Essa ferramenta cria um ambiente isolado $ stack new primeiro-projeto simple $ cd primeiro-projeto $ stack setup $ stack build $ stack exec primeiro-projeto Os dois últimos comandos são referentes a compilação do projeto e execução. 39

Stack O stack cria a seguinte estrutura de diretório: LICENSE: informação sobre a licença de uso do software. README.md: informações sobre o projeto em formato Markdown. Setup.hs: retrocompatibilidade com o sistema cabal. primeiro-projeto.cabal: informações das dependências do projeto. Atualizado automaticamente pelo stack. 40

Stack stack.yaml: parâmetros do projeto package.yaml: configurações de compilação e dependências de bibliotecas externas. src/main.hs: arquivo principal do projeto. 41

Main.hs module Main where -- indica que é o módulo principal main :: IO () main = do putstrln "hello world" -- início da função principal -- imprime hello world 42

Atividade Modifique o código Main.hs do primeiro-projeto criando uma função triplo que multiplica um valor x por 3. Modifique a função main da seguinte forma para testar: main :: IO () main = do print (triplo 2) 43