Haskell. O que é Haskell Nomeada em homenagem ao lógico Haskell Brooks Curry, como uma base para linguagens funcionais. É baseada no lambda calculus.

Slides:



Advertisements
Apresentações semelhantes
Input/Output em Haskell
Advertisements

C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Shell Script Professor: João Paulo
Programação para Engenharia I
Software Básico Silvio Fernandes
Introdução a Programação Renata Freire
Teste de Software Parte 3.
Rafael Pinto Frederico Corrêa
Como se familiarizar com seu banco de dados Como se familiarizar com seu banco de dados usando o SPSS Profa. Suzi Camey Depto de Estatística - UFRGS.
Linguagem C Estruturas de Controle de Fluxos
Universidade Federal do Espírito Santo
Paradigmas da Programação
Instrutor: Nilo Menezes
Linguagem C Estruturas de Sequências
Revisão da Linguagem C.
O Portal do Estudante de Computação
Otavio Bergmann e Raphael Miollo Parte 2 – Investigação e apresentação.
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Python Uma introdução Klaus Natorf Quelhas Novembro de 2009.
Unidade I: “Dê um mergulho rápido”
Sub-programas. Mecanismo de composição de programas Sub-programa está para peça de LEGO assim como um programa está para a construção.
Aula prática 6 Vetores e Matrizes
Haskell.
FTIN Formação Técnica em Informática
CADEIA DE CARACTERES (Strings)
Programação I Aula 2 (Métodos)
Seminário 1: Revisão de C
Fábio de Oliveira Borges
Introdução a aplicativos Java
Tipos de Dados Paradigmas de Programação
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Centro de Informática – UFPE
Programação em C++ Compiladores
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
3. Introdução à Linguagem C
Linguagem de Programação C#
Algumas notas sobre a linguagem de programação C
Programação Orientada a Objetos - Java
Aula prática 2 Operadores e Expressões Comandos de Decisão Comentários
Aula Prática 4 Monitoria IP/CC (~if669).
Linguagem de Programação JAVA
Acabias Marques Luiz. I - Introdução ao Ruby Parte 1 – Introdução a linguagem  O que é Ruby  Instalação  O IRB  Operadores Aritméticos  Tipos de.
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
Programação Funcional
JAVA Sintaxe.
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Aula Prática 1 Monitoria IP/CC (~if669) (A partir do slide elaborado por Luís Gabriel)
Faculdade Pernambucana - FAPE Setembro/2007
Haskell Programação Funcional Diego Lima Rubem Moreira.
Fundamentos de linguagens de programação
Linguagem C.
Copyright 2000, Departamento de Informática, UFPE. Todos os direitos reservados sob a legislação em vigor. Orientação a Objetos e Java.
Programação de Computadores - 1
Introdução à Programação
Programação Computacional Aula 9: Meu primeiro programa em C
Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem.
Profa. Maria Augusta Constante Puget
PROGRAMAÇÃO II – PARTE 6 Profa. Maria Augusta Constante Puget.
Programação Funcional 4a. Seção de Slides Tuplas e Definição de Funções Locais em Haskell.
Shell Script Parte 2.
Paradigmas das Linguagens de Programação - História
11 Revisão da Linguagem C Prof. Kariston Pereira Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
JavaScript Introdução ao JavaScript 1. Objetivos Introdução Sintaxe Básica Arquivo (script) externo Script no HEAD da página Script no BODY da página.
Estrutura de Dados Prof. André Cypriano M. Costa
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
Ambientação com a Sintaxe de Java: parte 2 Prof. Gustavo Wagner Slides Originais: Prof. Tiago Massoni Desenvolvimento de Sistemas FATEC-PB  Centro de.
Introdução à Orientação a Objetos em Java Prof. Gustavo Wagner (Alterações) Slides originais: Prof. Tiago Massoni Desenvolvimento de Sistemas FATEC-PB.
Transcrição da apresentação:

Haskell

O que é Haskell Nomeada em homenagem ao lógico Haskell Brooks Curry, como uma base para linguagens funcionais. É baseada no lambda calculus. Open source Haskell B. Curry ( ) Haskell é funcional (isto é, tudo é feito com chamadas de funções), estática, implicitamente tipada (os tipos são checados pelo compilador, porém não é necessário declará-los), preguiçosa (nada é feito até que se precise).

O que é programação funcional? C, Java, Pascal, Ada, e assim por diante, são linguagens imperativas. São "imperativas" no sentido em que consistem em uma seqüencia de comandos, que são executados estritamente um após o outro. Haskell é uma linguagem funcional. Uma linguagem funcional é uma única expressão, que é executada avaliando essa expressão. Qualquer um que já usou uma planilha eletrônica, tem experiência em programação funcional. Em uma planilha, especificamos o valor de cada célula, em função dos valores de outras células. O foco está em "o quê" deve ser computado, e não "como" deve ser computado. Por exemplo: -nós não especificamos a ordem em que as planilhas devem ser computadas, ao invés disso, nós temos garantia que a planilha será calculada em uma ordem que respeite suas dependências. -nós não dizemos à planilha como alocar sua memória - melhor, esperamos apresentar-nos com um plano aparentemente infinito de células, e alocar na memória somente as células que estão realmente em uso. -na maioria das vezes, avaliamos o valor das células por uma "expressão" (cujas partes podem ser avaliadas em qualquer ordem), melhor que por uma "seqüência de comandos" que compute seu valor.

O cálculo lambda é uma coleção de diversos sistemas formais baseados em uma notação para funções inventada por Alonzo Church em 1936 com o intuito de capturar os aspectos mais básicos da maneira pela qual operadores ou funções podem ser combinados para formar outros operadores. O cálculo lambda serve como uma ponte entre linguagens funcionais de alto nível e suas implementavéis de baixo nível. Raízes para a apresentação do cálculo lambda como uma linguagem intermediária: uma linguagem extremamente simples, consistindo de somente algumas poucas construções sintáticas e de uma semântica simples. Uma implementação do cálculo lambda necessita somente suportar algumas construções simples. A sua semântica simples nos permite analisar facilmente a correção de sua implementação. Trata-se de uma linguagem expressiva, a qual é suficientemente poderosa para expressar todos os programas funcionais e, por conseguinte, todas as funções computáveis. Isto significa que, se uma boa implementação do cálculo lambda é disponível, pode-se implementar qualquer linguagem funcional através da implementação de um compilador desta para o cálculo lambda.

História do Haskell A primeira reunião do comitê - janeiro de 1988, metas da linguagem: -fácil ensino, completamente descrita através de uma sintaxe e semântica formal disponível livremente. Primeira versão 1 de abril de 1990; Versão 1.1 agosto de 1991; 1.2 em março de 1992; 1.3 maio de 1996; 1.4 em abril de Haskell 98, janeiro de versão mínima, estável e portável da linguagem e o biblioteca para ensino. Esse padrão sofreu uma revisão em janeiro de A partir de 2006 começou o processo de definição de um sucessor do padrão 98, conhecido informalmente por Haskell′ ("Haskell Prime").

Expressões simples Você pode digitar a maioria das expressões matemáticas diretamente no ghci. Prelude> é o prompt padrão do GHCi. Prelude> 3 * 5 15 Prelude> 4 ^ Prelude> (1 - 5)^(3 * 2 - 4) 16 Strings estão em aspas duplas. Você pode concatená-las usando ++. Prelude> "Hello" "Hello" Prelude> "Hello" ++ ", Haskell" "Hello, Haskell"

As chamadas das funções são feitas colocando se os argumentos diretamente depois da da função. Não existem parênteses para a chamada: Prelude> succ 5succ 6 Prelude> truncate 6.59truncate 6 Prelude> round 6.59round 7 Prelude> sqrt 2sqrt Prelude> not (5 < 3)not True Prelude> gcd 21 14gcd 7

O Console Ações de I/O podem ser usadas para ler e escrever a partir do próprio console. Algumas são descritas abaixo. Prelude> putStrLn "Hello, Haskell"putStrLn Hello, Haskell Prelude> putStr "No newline"putStr No newlinePrelude> print (5 + 4)print+ 9 Prelude> print (1 < 2)print True As funções putStr e putStrLn tem strings como saída para o terminal. A função print gere saída seja qual for o tipo. (Se você usar print para uma string, ela terá aspas duplas.) Se você precisar de múltiplas ações de I/O numa única expressão, você pode usar o bloco do. As ações são separadas por ponto e vírgula.putStrputStrLnprint Prelude> do { putStr "2 + 2 = " ; print (2 + 2) }putStrprint = 4 Prelude> do { putStrLn "ABCDE" ; putStrLn "12345" }putStrLn ABCDE 12345

A leitura pode ser feita com o getLine (no qual retorna uma String) ou readLn (no qual retorna qualquer tipo de valor que você deseje). O símbolo <- é usado para atribuir um nome ao resultado da ação I/O.getLineStringreadLn Prelude> do { n <- readLn ; print (n^2) }readLnprint 4 16 (O 4 era a entrada. O 16 foi o resultado) Existe também uma outra maneira de escrever blocos. Se você não colocar chaves e ponto e virgula, a identação se torna relevante. Isto não funciona tão bem no ghci, por isso é recomendado que ponha o código num arquivo (ex.: teste.hs) e compile. main = do putStrLn "What is 2 + 2?"putStrLn x <- readLnreadLn if x == 4== then putStrLn "You're right!"putStrLn else putStrLn "You're wrong!"putStrLn

Tipos Simples Até agora, nenhuma declaração de variável foi mencionada. Isto é porque Haskell faz dedução de tipos. Você geralmente não tem que declarar tipos a não ser que você queira. Se quiser declarar ponha :: para tal. Veja abaixo: Prelude> 5 :: IntInt 5 Prelude> 5 :: DoubleDouble 5.0 Tipos (e “classes tipo”, veremos mais adiante) sempre iniciam com letras maiúsculas em Haskell. Variáveis sempre iniciam com letras minúsculas Isto é uma regra, não uma convenção da linguagem. Você pode também perguntar ao ghci que tipo foi escolhido para alguma coisa. Isto é útil porque geralmente você não precisa declarar seus tipos.

Prelude> :t True True :: BoolBool Prelude> :t 'X' 'X' :: CharChar Prelude> :t "Hello, Haskell" "Hello, Haskell" :: [Char]Char (Como é notado neste caso, [Char] é outra maneira de dizer String.) Um pouco mais interessante, agora com número. Prelude> :t :: (Num t) => tNum Prelude> :t :: (Fractional t) => tFractional Prelude> :t gcd 15 20gcd gcd :: (Integral t) => tgcdIntegral Estes tipos usam “classes tipo”. Quer dizer: 42 pode ser usado como um tipo numérico qualquer. (Este é o porque de anteriormente eu ter declarado 5 como Int ou Double) pode ser qualquer tipo fracionário, mas não um tipo inteiro. gcdgcd (no qual é uma chamada de função) pode ser qualquer tipo inteiro, mas não um tipo decimal.

Existem cinco tipos numéricos no Haskell “prelude” (a parte da biblioteca que existe sem ter que importar nada): IntInt é um inteiro com no máximo 30 bits de precisão. IntegerInteger é um inteiro sem limitação de precisão. FloatFloat precisão simples de ponto flutuante. DoubleDouble precisão mais aprimorada de ponto flutuante. RationalRational tipo fracionário, sem nenhum erro de arredondamento. Todos os cinco são instancias da classe tipo Num. Os dois primeiros são instancias do Integral, e os outros três são instancias do Fractional.NumIntegralFractional

Dados estruturados Tipos básicos de dados podem ser combinados em duas maneiras: listas, na qual colocamos [entre colchetes], e tuplas que ficam (entre parênteses). Listas são usadas para agrupar multiplos valores do mesmo tip o. Prelude> [1, 2, 3] [1,2,3] Prelude> [1.. 5]. [1,2,3,4,5] Prelude> [1, ] [1,3,5,7,9] Prelude> [True, False, True] [True,False,True] Strings são apenas listas de caracteres. Prelude> ['H', 'e', 'l', 'l', 'o'] "Hello"

O operador : (dois pontos), coloca um item no início da lista. Prelude> 'C' : ['H', 'e', 'l', 'l', 'o'] "Chello" Tuplas mantem um numero fixo de valores, no qual pode haver diferentes tipos. Prelude> (1, True) (1,True) Prelude> zip [1.. 5] ['a'.. 'e']zip. [(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')] O ultimo exemplo, é usado zip, uma função da biblioteca que transforma duas listas em uma tupla.zip

Os tipos que provavelmente esperamos. Prelude> :t ['a'.. 'c'] ['a'.. 'c'] :: [Char].Char Prelude> :t [('x', True), ('y', False)] [('x', True), ('y', False)] :: [(Char, Bool)]CharBool As listas são muitos usadas em Haskell. Abaixo algumas funções úteis. Prelude> [1.. 5]. [1,2,3,4,5] Prelude> map (+ 2) [1.. 5]map+. [3,4,5,6,7] Prelude> filter (> 2) [1.. 5]filter. [3,4,5] Prelude> fst (1, 2)fst 1 Prelude> snd (1, 2)snd 2 Prelude> map fst [(1, 2), (3, 4), (5, 6)]mapfst [1,3,5]

Definições de funções Como já demonstrado anteriormente, uma ação I/O, chamada main: main = do putStrLn "What is 2 + 2?"putStrLn x <- readLnreadLn if x == 4== then putStrLn "You're right!"putStrLn else putStrLn "You're wrong!"putStrLn Agora, temos uma função chamando outra função: factorial n = if n == 0 then 1 else n * factorial (n - 1)==*- main = do putStrLn "What is 5! ?"putStrLn x <- readLnreadLn if x == factorial 5== then putStrLn "You're right!"putStrLn else putStrLn "You're wrong!"putStrLn

Compilando de novo com ghc-make Teste.hs. E, $./Test What is 5! ? 120 You're right! Temos um função, podendo ser chamada como fatorial 5 sem precisar usar parênteses Agora perguntamos ao ghci o tipo. $ ghci Test.hs > Ok, modules loaded: Main. Prelude Main> :t factorial factorial :: (Num a) => a -> aNum Tipos de funções são escritas com um tipo de argumento, depois ->, depois o tipo do resultado. A função fatorial também pode ser simplificada sendo escrita com analise de caso. factorial 0 = 1 factorial n = n * factorial (n - 1)*-

Sintaxes convenientes Algumas outras sintaxes que podem ser úteis. secsToWeeks secs = let perMinute = 60 perHour = 60 * perMinute* perDay = 24 * perHour* perWeek = 7 * perDay* in secs / perWeek A expressão let define nomes temporários. classify age = case age of 0 -> "newborn" 1 -> "infant" 2 -> "toddler" _ -> "senior citizen"

Quicksort in C // To sort array a[] of size n: qsort(a,0,n-1) void qsort(int a[], int lo, int hi) { { int h, l, p, t; if (lo < hi) { l = lo; h = hi; p = a[hi]; do { while ((l < h) && (a[l] <= p)) l = l+1; while ((h > l) && (a[h] >= p)) h = h-1; if (l < h) { t = a[l]; a[l] = a[h]; a[h] = t; } } while (l < h); a[hi] = a[l]; a[l] = p; qsort( a, lo, l-1 ); qsort( a, l+1, hi ); }

Quicksort in Haskell qsort [] = [] qsort (x:xs) = qsort (filter ( = x) xs)filter++ filter>= A primeira linha lê-se: "Quando você classifica uma lista vazia ( [] ), o resultado é uma outra lista vazia". A segunda linha diz: "Para ordenar uma lista cujo primeiro elemento é chamado x e o resto do que é chamado xs, classificar os elementos de xs, que são menos de x, classificar os elementos de xs, que são iguais ou superiores a x, e concatenar ( + + ) os resultados, com x colada no meio.

Evolução Características do Haskell incluem o suporte a funções recursivas e tipos de dados, casamento de padrões, list comprehensions, guard statements e avaliação preguiçosa, esta, um elo em comum entre os diversos grupos de desenvolvimento da linguagem. A combinação destas características pode fazer com que a construção de funções que seriam complexas em uma linguagem procedimental de programação tornem-se uma tarefa quase trivial em Haskell.funções recursivastipos de dadoscasamento de padrõeslist comprehensionsavaliação preguiçosa linguagem procedimental Segundo dados de 2002, é a linguagem funcional sobre a qual mais pesquisa está sendo realizada. Muitas variantes tem sido desenvolvidas: versões paralelizáveis do MIT e Glasgow, ambas chamadas Parallel Haskell, outras versões paralelas e distribuidas chamadas Distributed Haskell (anteriormente Goffin) e Eden, uma versão chamada Eager Haskell e várias versões orientadas a objetos: Haskell++, O'Haskell e Mondrian.MITGlasgow Uma versão educacional do Haskell chamada Gofer foi desenvolvida por Mark Jones. Ela é oferecida pelo HUGS. Existe também uma versão do Haskell que permite orientação a aspectos (POA), chamada AspectH.

ABN AMROABN AMRO Amsterdã, Holanda ABN AMRO é um banco internacional sediado em Amsterdã. É usado para medir os riscos de investimentos dos portifólios. AT&T Haskell é usado na divisão de segurança para automatizar processos de reclamações sobre abusos na internet. Haskell tem um amplo uso comercial, de aeronaves e defesa, finanças, complementos web, empresas de design de hardware, etc.

bottles 0 = "no more bottles" bottles 1 = "1 bottle" bottles n = show n ++ " bottles" verse 0 = "No more bottles of beer on the wall, no more bottles of beer.\n" ++ "Go to the store and buy some more, 99 bottles of beer on the wall." verse n = bottles n ++ " of beer on the wall, " ++ bottles n ++ " of beer.\n" ++ "Take one down and pass it around, " ++ bottles (n-1) ++ " of beer on the wall.\n" main = mapM (putStrLn. verse) [99,98..0] 99 Bottles of Beer