Post on 17-Apr-2015
Seminco – 2006Blumenau - SC
A Linguagem Haskell
Claudio Cesar de Sá
Grupo de Computação Cognitiva Aplicada (COCA)
Universidade do Estado de Santa Catarina (UDESC)
http://www2.joinville.udesc.br/~coca/
Seminco – 2006Blumenau - SC
Agenda
1. O que é uma Linguagem de Programação
2. Os Paradigmas das LPs
3. Histórico e contexto do Haskell
4. Características
5. Exemplos
6. Aplicações
7. O livro: Haskell: Uma Abordagem Prática
8. Referências
Seminco – 2006Blumenau - SC
Linguagem de ProgramaçãoLinguagem de Programação
O Propósito das Linguagens de Programação:(O que é uma linguagem de programação?)
“Abstração de uma máquina virtual”
“Programar é a arte de contar a outro humano aquilo que se quer que o computador faça.”
Seminco – 2006Blumenau - SC
Paradigmas de Linguagens de Programação
IMPERATIVAS: C, Basic, Assembler, Fortran, Cobol,FUNCIONAIS: Lisp, Miranda, Scheme, Comoom Lisp,
Haskell, ML,...LÓGICAS: Prolog e derivadosORIENTADAS A OBETOS: Smalltalk, ...HÍBRIDAS: C++ Builder, Java, Delphi, Kylix, ...ESPECÍFICAS: GPSS, Simula, Auto-Lisp, ...BASEADAS EM REGRAS de PRODUÇÃO: CLIPS,
Jess, ... Shell de SE’s...SEBESTA ,Robert W. Concepts of Programming Languages.
4 ed. Addison Wesley, 1999.
Seminco – 2006Blumenau - SC
Qual linguagem a ser ensinada?
FuncionaisImperativas ou procedurais
C
C++
Visual C++
Visual BasicJava
Assembler
Fortran
Cobol
Haskell ML
Scheme Erlang
Seminco – 2006Blumenau - SC
Evolução: Genealogia
From Sebesta’sFrom Sebesta’s
Concepts of Concepts of
ProgrammingProgramming
LanguagesLanguages
HaskellHaskell
PrologProlog
SWI-PrologSWI-Prolog
Seminco – 2006Blumenau - SC
Histórico do Haskell
• Origem do nome: Haskell Brooks Curry
• Criado pelo comitê da conferência de FPCA em, 1987– Necessidade de uma linguagem puramente
funcional, “padrão”, sem restrições de uso, …
• Uma versão consolidada: Haskell 98
• Uma LP projetada (~ 10 anos)
Seminco – 2006Blumenau - SC
Porquê do Haskell?
• Haskell é uma linguagem de muito alto-nível (muitos detalhes são tratados automaticamente)
• Haskell tem uma boa expressividade e concissão (muita coisa com pouco esforço)
• Haskell é eficiente no tratamento de dados complexos e na combinação de componentes
• Em contra-partida, Haskell não tem um altíssimo desempenho em termos de LP, pois prioriza o tempo do programador em relação ao da CPU!
Seminco – 2006Blumenau - SC
Objetivos do Projeto da Linguagem Haskell:
• Apropriada ao ensino de programação, pesquisas, e aplicações (reais)
• Descrição completa e aberta de sua sintaxe e semântica forma
• Código livre e multi-plataforma• As idéias fundamentais do Haskell, deveria ser um
consenso da comunidade• Reduzir a diversividade do número de LP funcionais• Escalabilidade
Seminco – 2006Blumenau - SC
Características:
• Legibilidade• Rápido aprendizado: conceito elementar de
funções (ensino médio)• Análoga a ML, e outras LPs funcionais• Motivar o estudo do Lambda Cálculo. Haskell é
100% Cálculo Lambda• Módulos permitem um crescimento linear dos
projetos com Haskell
Seminco – 2006Blumenau - SC
Um Exemplo:
Teorema de Pitagoras:
hipot :: Float -> Doublehipot x y = sqrt (x*x + y*y)
Main> hipot 1 11.4142135623731
x y
Casamento de padrões: x e y(Pattern matching)
Seminco – 2006Blumenau - SC
Interpretadores e Compiladores
• GHC
• nhc98
• HBC / HBI
• Hugs
• www.haskell.org/implementations.html
Seminco – 2006Blumenau - SC
O Interpretador Hugs
Iniciando o hugs Haskell:
> hugs__ __ __ __ ____ ___ _______________________________________________|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard||___|| ||__|| ||__|| __|| Copyright (c) 1994-2003||---|| ___|| World Wide Web: http://haskell.org/hugs|| || Report bugs to: hugs-bugs@haskell.org|| || Version: Nov 2003 _______________________________________________Type :? for helpPrelude>
O prompt. O Hugs está pronto para uma entrada
Seminco – 2006Blumenau - SC
Definindo uma função ”quase igual”
Definindo novos operadores com nome construído por símbolos
x ~== y = x-y < 0.000001
Definindo um novo operador
~==
Os argumentos x e y
O qual retorna True se a diferença entre x e y for menor do
que 0.000001
Seminco – 2006Blumenau - SC
Executando a função/operador: ``~==´´
Main> 3 ~== 3.0000001TrueMain> 3~==4True
OK
Qual o erro?
x ~== y = x-y < 0.000001
Seminco – 2006Blumenau - SC
Consertando a definição
• Uma função auxiliar
Main> abs 33Main> abs (-3)3
A função do valor absoluto
x ~== y = abs (x-y) < 0.000001
Main> 3 ~== 4False
Seminco – 2006Blumenau - SC
Premissa do código, e das funções a seguir:
type Picture = [[Char]] -- [String]
horse :: Picture
horse = [".......##...", ".....##..#..", "...##.....#.", "..#.......#.", "..#...#...#.", "..#...###.#.", ".#....#..##.", "..#...#.....", "...#...#....", "....#..#....", ".....#.#....", "......##...."]
Seminco – 2006Blumenau - SC
Combinando Funções
Uma função para colocar uma figura sobre :
um_sobre_outro
Seminco – 2006Blumenau - SC
Mais código:
um_sobre_outro :: Picture -> Picture -> Pictureum_sobre_outro = (++) -- sem argumentosouum_sobre_outro x = append x x
Uma simples concatenação (duplica) da mesma lista....mesmafigura... Uma após a
outra..
append :: [a] -> [a] -> [a]append [ ] ys = ysappend (x : xs) ys = x : append xs ys
Seminco – 2006Blumenau - SC
Executando....Cavalos> imp_cavalo (um_sobre_outro horse).......##........##..#.....##.....#...#.......#...#...#...#...#...###.#..#....#..##...#...#........#...#........#..#.........#.#..........##...........##........##..#.....##.....#...#.......#...#...#...#...#...###.#..#....#..##...#...#........#...#........#..#.........#.#..........##.....................
Cavalos>
Seminco – 2006Blumenau - SC
Executando....Cavalos> imp_cavalo (append horse (vira_V horse)).......##........##..#.....##.....#...#.......#...#...#...#...#...###.#..#....#..##...#...#........#...#........#..#.........#.#..........##.......##.........#..##......#.....##....#.......#...#...#...#...#.###...#...##..#....#......#...#......#...#.......#..#........#.#.........##.......................Cavalos>
Seminco – 2006Blumenau - SC
Aplicações
• Simpósio Brasileiro de LPs => compiladores• Ensino: LPs, paradigmas de LPs, Estruturas de Dados,
projeto de sistemas, prototipação, IA,• Wiki-Haskell• Suporte da BD• Haskell.NET
Seminco – 2006Blumenau - SC
Um livro neste processo
• http://br.geocities.com/lpg3udesc/ :: uma disciplina de graduação que foi construída
• Alguns artigos na área de educação• Várias disciplinas envolvidas• Uma motivação, um grupo, uma atmosfera, uma novidade, as
descobertas, as desconfianças, • Um resultado:
http://www2.joinville.udesc.br/~coca/index.php/Main/PaginaDoLivroDeHaskell
Seminco – 2006Blumenau - SC
Capítulos
1. Introdução
2. Matemática Funcional
3. Uma Visão Funcional da Indução
4. Tuplas
5. Listas
6. Tipos de Dados
7. Classes
Seminco – 2006Blumenau - SC
Capítulos
8. Lambda Cálculo
9. Generalização
10. Figuras Textos
11. Vetores
12. Árvores
13. Algoritmos de Ordenação
14. Elementos Não-Funcionais
Seminco – 2006Blumenau - SC
Capítulos
15. Entradas, Saídas e Seqüências de Ações
16. Problemas
17. Reflexões Finais
A. Ambientes de Programação
B. Funções Complementares
Seminco – 2006Blumenau - SC
Um estudante
Uma editora: um projeto!
Seminco – 2006Blumenau - SC
Uma idealização efetivada
Seminco – 2006Blumenau - SC
Futuro
• A verticalização: aplicações e melhorias• A comunidade se amplia
Seminco – 2006Blumenau - SC
• Hudak, P. et al (2000) “A Gentle Introduction to Haskell Version 98” http://www.haskell.org/tutorial
• Jones, S.P. et al (1999) “The Haskell 98 Report” http://www.haskell.org/onlinereport
• Winstanley, Noel (1999) “What the Hell are Monads?” http://www.dcs.gla.ac.uk/~nww/Monad.html
• http:// www.haskell.org• http://www2.joinville.udesc.br/~coca/index.php/Main/
PaginaDoLivroDeHaskell
Referências
Seminco – 2006Blumenau - SC
Muito Obrigado !