Ambassade de Monaco aux Etats
Transcription
Ambassade de Monaco aux Etats
Seminário de Haskell Universidade Federal de São Paulo - UNIFESP SEMINÁRIO DE PARADIGMAS Linguagem :HASKELL GRUPO: Aryel Fernandes Bruno Gabriel dos Santos Renan Augusto William Higino Haskell: O que é? Linguagem de Programação funcional; Modelo de estruturas de dados baseados na teoria dos conjuntos; Dada uma entrada, temos uma saída; Histórico - O nome da linguagem é uma homenagem ao pesquisador Haskell Brooks Curry, responsável pelo desenvolvimento da lógica que a linguagem se baseia; - Lógica combinatória. - Baseada no cálculo lambida, desenvolvido por Alonzo Church, cálculo lambida linguagem abstrata, funções que podem ser combinadas a fim de gerar outras funções. Histórico 1987 – Conferência FPCA (Functional Programming Languages and Computer Architecture); Pontos levantados: Dezenas de linguagens funcionais haviam sido implementadas e propostas; Caráter funcional, linguagens com expressividade de sintaxe e semântica equivalentes entre si; Motivação: Motivação uma linguagem de consenso deveria impulsionar a área. Objetivos da criação de uma linguagem: Ser viável para ensino, pesquisa e aplicações; Não ser proprietária; Reduzir a diversidade desnecessária de outras linguagens funcionais; Primeira versão: Versão 1.0 - Abril de 1990; Versão 1.1 - agosto de 1991 Versão atual: Haskell 98 – Janeiro de 1999, revisão feita em 2006, versão mínima, estável e portável da linguagem. Visão crítica Vantagens: Vantagens → Construção eficiente de programas; →Prova de propriedades; →Transformação de programas: otimizados sem perda de funcionalidade; → Causa e efeito do mundo real: Dada uma entrada temos uma saída; Desvantagens: Desvantagens →Implementações ineficientes: Recursividade; →O mundo não é funcional, apenas aplicações típicas seguem o padrão de processamento de dados: TABELA Paradigma: Funcional Alta Portabilidade: Possui versão para todos os S.O mais utilizados atualmente (Linux, Mac OS, Windows). Compilada e/ou interpretada: GHC compilador mais utilizado, rápido e suporta compilação incremental (compilador é parte do ambiente de execução, código fonte pode ser lido a qualquer momento, sendo traduzido para linguagem de máquina), HUGS interpretador mais utilizado (rápida compilação e razoável execução, escrito em C). IDE: Leksah; também possui plugins para Eclipse e Netbeans. Debuggers: GHCI contém um simples debugger estilo imperativo. Softwares: Haskell-in-Space → jogo de asteróides em Haskell; Truth → plataforma para sistemas distrubuídos; Hoogle → uma API para busca; Outras ferramentas de de compilação e interpretação: NHC98 → Compilador mais rápido que o Hugs, foca na minimização do uso de memória, boa escolha para máquinas antigas; Helium → novo compilador desenvolvido especialmente para ensino de Haskell. Atualmente carece em typeclasses, sendo incompatível com muitos programas Haskell; YHC → simplificação do NHC98 e mais portável. Características interessantes Avaliação preguiçosa: evita cálculos desnecessários, aumenta o desempenho; Suporta 100% o lámbida cálculo; Estilo declarativo: sem o conceito de comandos de atribuição: (ex: int x = 5); Apresenta polimorfismo; Influenciada por ML; Interpretada (HUGS) e/ou compilada (GHC); Alta portabilidade (versões para todos os sistemas operacionais mais utilizados atualmente); Aplicações Computação simbológica; Processamento de listas; Aplicações científicas; Aplicações de IA; Jogos; Compiladores. Empresas que utilizam Haskell ABN-AMRO (Amsterdã, Holanda): Banco internacional que utilizada Haskell para análise e medição de risco em atividades de investimento bancário e crédito de risco. Página: http://www.abnamro.com/ Aetion Technologies LLC (Ohio, EUA): A Aetion é uma empresa que opera no ramo de Defesa, utiliza Haskell para desenvolvimento de aplicações que lidam com inteligência artificial. Possui três grandes projetos na linguagem: Snowdrift, Wintermute e Pawprints. A empresa pede como requisito para contratação de funcionários conhecimentos em Haskell. Página: http://www.aetion.com/ AT&T (Estados Unidos): a maior empresa no ramo de telecomunicações, internet e multimédia dos Estados Unidos, utiliza Haskell na sua Divisão de Segurança de Redes, para automatizar queixas de abusos de internet. De acordo com a empresa, Haskell permite-lhes facilmente cumprir prazos com resultados satisfatórios. Site oficial: http://www.att.com/ Deutsche Bank (Alemanha): uma das divisões deste banco (Directional Credit Trading) utiliza Haskell como sua principal linguagem em toda a sua infraestrutura de software. Site oficial: http://www.db.com/ Empresas que utilizam Haskell [2] Anygma (Antuérpia, Bélgica): é uma empresa orientada à multimédia, que se dedica à criação de aplicações audiovisuais (em 2D e 3D) fáceis de utilizar. Neste momento, a Anygma está a preparar a sua nova plataforma de criações e está a utilizar Haskell para o desenvolvimento do protótipo. Além disso, esta empresa está a contratar engenheiros de software. Um dos requisitos base é o conhecimento e utilização de uma linguagem funcional, neste caso, Haskell. Site oficial: http://www.anygma.com/ Facebook (EUA): utiliza Haskell internamente, para manipular códigos PHP via Haskell Site oficial: http://www.facebook.com FONTE PRINCIPAL: http://www.haskell.org/haskellwiki/Haskell_in_industry Características básicas: Sintaxe de funções Trabalha-se somente com funções, seus parâmetros e seus retornos; É case-sensitive; Difere maiúsculas e minúsculas Não possui comandos de repetição como While e For; Sem limites para identificadores. Recursão [1] Uma maneira simples de simular um looping é utilizando recursão; Exemplo: maximum' :: (Ord a) => [a] -> a maximum' [] = error "Lista vazia" maximum' [x] = x maximum' (x:xs) = max x (maximum' xs) Recursão [2] Exemplos: Fatorial de zero = 1 funciona! – Somar elementos de uma lista somar :: [Int] -> Int somar [] = 0 somar (x:xs) = x + somar(xs) – Fatorial de um Número fatorial n = product [1..n] Lista vazia resultado 0, caso contrário remove a cabeça e a soma com a recursiva da calda! product é recursivo! Função MAP Retorna uma lista, aplica uma função (primeiro parâmetro) em todos os elementos da lista (segundo parâmetro) ; Exemplos: 1º parâmetro (função) 2º parâmetro (lista) Input: map reverse [“abc”,”def”] output: [“cba”,”fed”] Input: map (3*) [1,2,3,4] Input: map (odd) [1,2,3,4] output: [True,False,True,False] Output: [3,6,9,12] Input: map (>3) [1,2,3,4] Output: [False,False,False,True] Função FILTER Retorna como resposta os elementos que satisfazem um teste (primeiro parâmetro) de uma lista passada como parâmetro. Exemplos: Input: filter (isAlpha) "#!+abDE67" output: “abDE” Input: filter (even) [1,2,3,4] Output: [2,4] Input: filter (>2) [1,2,3,4] output: [3,4] Input: filter (==2) [1,2,3,4,2] Output: [2,2] Composição de funções Composição de função é o ato de utilizar o resultado de uma função e passar como parâmetro para outra, criando uma função totalmente nova. Devemos ficar atentos, a ordem Input: (reverse . sort) [5,4,3,10] das funções é importa, output: [10,5,4,3] “Lambida Cálculo”. Exemplos: Input: (sort . reverse) [5,4,3,10] Output: [3,4,5,10] Para usar sort, tem que importar a biblioteca Data.List Import Data.List Operador guardas “|” Símbolo: “ | ” Separa o nome da função e seus argumentos de uma parte condicional à execução do corpo da função; Quando tivermos | há uma condição lógica a ser verificada; Ex: Cálculo número de fibonacci: Comentários após -- fib n | n == 0 = 0 -- Condicao 1 | n == 1 = 1 -- Condicao 2 | otherwise = fib (n-1) + fib (n-2) -- Condicao 3 Rodando um programa Salvar o código fonte na extensão .hs Chamada para o GHCI Interpretada utilizando :l nome.hs Tipos básicos e operadores Tipo Descrição Exemplo Bool Valores lógicos True e False Char Caracteres simples 'a', 'x' String String de caracteres “hello world”, “legal” Int inteiros 5,8,10,-50 Integer Precisão arbitrária Idem anterior. Float Ponto flutuante 3.1415 Nome Símbolo Nome Símbolo Maior > Soma + Maior ou igual >= Subtração - Igual == Divisão / Diferente /= Multiplicação * Menor < Potência ^ Menor ou igual <= Divisão inteira div e && Resto da divisão mod ou || Valor absoluto abs negação not Trocar sinal do valor negate Listas Descrição: Sequência de valores do mesmo tipo: Exemplos: [1,2,3] :: [Int] [False,True] :: [Bool] ['a','e'] :: [Char] Operações: Comando Descrição Exemplo: Saída head Retorna a cabeça da lista head [1,2,3,4] 1 tail Retorna a calda da lista tail [1,2,3,4] [2,3,4] last Retorna o último elemento da lista last [1,2,3] 3 init Retorna todos exceto último elem. init [1,2,3,4] [1,2,3] length Retorna o comprimento da lista length [1,2] 2 reverse Inverte a lista reverse [1,2,3] [3,2,1] elem Verifica se um elemento pertence 1 'elem' [1,2,3] True [inicio .. fim] Seleciona intervalos de valores [1..5] [1,2,3,4,5] Listas [2] Adicionando um elemento no início de uma lista: Basta fazer: 5: [6,7] Exemplo: Função que adiciona objeto não repetido: Constrói-se uma lista usando o conceito de inserção no início insere c [] = [c] insere c (a:x) | c == a = a:x | otherwise = a: insere c x Lista [3] Tuplas Descrição: Conjunto de dados heterogêneos Exemplos: (“Fernanda”,18,65,23,”Tenis”) Exemplo de criação de função para tuplas: soma_e_sub :: Int->Int -> (Int, Int) soma_e_sub (a,b) = (a + b, a – b) Observações interessantes: No caso particular com tuplas-2 ou par binário, Haskell possui duas funções pré-definidas fst e snd. fst (first) → extrai o primeiro elemento da tupla : fst (5, “bom dia”) Resultado: 5 snd (second) → extrai o segundo elemento da tupla: snd (5, “bom dia”) Resultado: “bom dia” Tuplas [2] Função Currificada: Considere a função anterior, soma_e_sub. Apresenta um único parâmetro, pois é uma tupla (estrutura única), encapsulados os valores de a e b, reescrevendo: soma_e_sub :: Int - > Int -> (Int, Int) soma_e_sub a b = (a + b, a – b) Função zip: utilizado para combinar valores: Criando funções Função que retorna o maior entre dois elementos: maximo :: Int -> Int -> Int maximo x y | x >= y = x | otherwise = y Recebe dois Int retorna um Int Polimorfismo Exemplo Calcula o comprimento, recebe algo e retorna um Int Operador _ independente do seu valor QuickSort - Haskell Lista vazia, não ordenamos nada. quicksort [ ] = [ ] s → 1º elemento usado como pivo xs restante. quicksort(s : xs) = quicksort[x | x<- xs, x<s] A lista restante é dividida em duas partes: Elementos menores de xs que s e maiores que s. ++[s]++ quicksort [x| x<- xs, x>= s] As duas listas são ordenadas recursivamente, o resultado obtido é concatenado a primeira lista com a lista que contém s e a segunda lista. QuickSort - JAVA Mochila - Haskell Mochila - JAVA Matriz 10 x 10 - Haskell Matriz 10 x 10 - Java Haskell - XML Java - XML Conteúdo Adicional: Haskell Obra indicada Motivos: Tem na biblioteca; Obra curta (296 pág); Direta. Conteúdo: O que é Haskell; Matemática funcional; Tuplas, Tipos de Dados; Vetores; Entrada/Saída. Outros livros
Documents pareils
Princess Charlene of Monaco Foundation USA » 11 mai 2016
Los Angeles, le 3 mai 2016 — Mercredi 11 mai, S.A.S. la Princesse Charlène de Monaco
inaugurera à l’Annenberg Community Beach House de Santa Monica la branche américaine
de Sa Fondation dont les mi...
Ambassade de Monaco aux Etats
Hongrie, Islande, Indonésie, Corée, Kosovo, Mexique, Mozambique, PaysBas, Slovénie, Trinité-et-Tobago). D’autres personnalités telles le PDG de la
« Wolf Trap Foundation for the Performing Arts », ...