Linguagem de Programação

Propaganda
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 – 2006
Blumenau - SC
Agenda
1.
2.
3.
4.
5.
6.
7.
8.
O que é uma Linguagem de Programação
Os Paradigmas das LPs
Histórico e contexto do Haskell
Características
Exemplos
Aplicações
O livro: Haskell: Uma Abordagem Prática
Referências
Seminco – 2006
Blumenau - SC
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.”
Linguagem de Programação
Seminco – 2006
Blumenau - 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 derivados
ORIENTADAS 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 – 2006
Blumenau - SC
Qual linguagem a ser ensinada?
Imperativas ou procedurais
Funcionais
C++
Haskell
ML
Cobol
C
Visual C++
Scheme
Erlang
Assembler
Java
Seminco – 2006
Blumenau - SC
Visual Basic
Fortran
Evolução: Genealogia
Prolog
Haskell
SWI-Prolog
From Sebesta’s
Concepts of
Programming
Seminco – 2006
Blumenau - SC
Languages
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 – 2006
Blumenau - 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 – 2006
Blumenau - 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 – 2006
Blumenau - 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 – 2006
Blumenau - SC
Um Exemplo:
Teorema de Pitagoras:
hipot :: Float -> Double
hipot x y = sqrt (x*x + y*y)
Main> hipot 1 1
1.4142135623731
Seminco – 2006
Blumenau - SC
Casamento de padrões: x e y
(Pattern matching)
x
y
Interpretadores e Compiladores
•
•
•
•
GHC
nhc98
HBC / HBI
Hugs
• www.haskell.org/implementations.html
Seminco – 2006
Blumenau - SC
O Interpretador Hugs
Iniciando o hugs Haskell:
> hugs
__
__ __ __ ____
___
||
|| || || || || ||__
||___|| ||__|| ||__|| __||
||---||
___||
||
||
||
|| Version: Nov 2003
Type :? for help
Prelude>
_______________________________________________
Hugs 98: Based on the Haskell 98 standard
Copyright (c) 1994-2003
World Wide Web: http://haskell.org/hugs
Report bugs to: [email protected]
_______________________________________________
O prompt. O Hugs está pronto para uma entrada
Seminco – 2006
Blumenau - SC
Definindo uma função ”quase igual”
Definindo novos operadores com nome construído por
símbolos
x ~== y = x-y < 0.000001
Os argumentos
xey
Definindo um
novo operador
Seminco – 2006
Blumenau~==
- SC
O qual retorna True
se a diferença entre
x e y for menor do
que 0.000001
Executando a função/operador: ``~==´´
Main> 3 ~== 3.0000001
True
Main> 3~==4
True
Qual o erro?
x ~== y = x-y < 0.000001
Seminco – 2006
Blumenau - SC
OK
Consertando a definição
• Uma função auxiliar
Main> abs 3
3
Main> abs (-3)
3
A função do valor absoluto
x ~== y = abs (x-y) < 0.000001
Main> 3 ~== 4
False
Seminco – 2006
Blumenau - SC
Premissa do código, e das funções a seguir:
type Picture = [[Char]]
horse :: Picture
horse = [".......##...",
".....##..#..",
"...##.....#.",
"..#.......#.",
"..#...#...#.",
"..#...###.#.",
".#....#..##.",
"..#...#.....",
"...#...#....",
"....#..#....",
".....#.#....",
"......##...."]
Seminco – 2006
Blumenau - SC
-- [String]
Combinando Funções
Uma função para colocar uma figura sobre :
um_sobre_outro
Seminco – 2006
Blumenau - SC
Mais código:
um_sobre_outro :: Picture -> Picture -> Picture
um_sobre_outro = (++)
-- sem argumentos
ou
um_sobre_outro x = append x x
Uma simples
concatenação (duplica)
da mesma lista....mesma
figura... Uma após a
outra..
append :: [a] -> [a] -> [a]
append [ ] ys
= ys
append (x : xs) ys = x : append xs ys
Seminco – 2006
Blumenau - SC
Executando....
Cavalos> imp_cavalo
.......##...
.....##..#..
...##.....#.
..#.......#.
..#...#...#.
..#...###.#.
.#....#..##.
..#...#.....
...#...#....
....#..#....
.....#.#....
......##....
.......##...
.....##..#..
...##.....#.
..#.......#.
..#...#...#.
..#...###.#.
.#....#..##.
..#...#.....
...#...#....
....#..#....
.....#.#....
......##....
.................
Seminco – 2006
Blumenau - SC
Cavalos>
(um_sobre_outro
horse)
Executando....
Seminco – 2006
Blumenau - SC
Cavalos> imp_cavalo
.......##...
.....##..#..
...##.....#.
..#.......#.
..#...#...#.
..#...###.#.
.#....#..##.
..#...#.....
...#...#....
....#..#....
.....#.#....
......##....
...##.......
..#..##.....
.#.....##...
.#.......#..
.#...#...#..
.#.###...#..
.##..#....#.
.....#...#..
....#...#...
....#..#....
....#.#.....
....##......
.................
Cavalos>
(append
horse (vira_V horse))
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 – 2006
Blumenau - 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/PaginaDoLivroDe
Haskell
Seminco – 2006
Blumenau - SC
Capítulos
1.
2.
3.
4.
5.
6.
7.
Introdução
Matemática Funcional
Uma Visão Funcional da Indução
Tuplas
Listas
Tipos de Dados
Classes
Seminco – 2006
Blumenau - SC
Capítulos
8.
9.
10.
11.
12.
13.
14.
Lambda Cálculo
Generalização
Figuras Textos
Vetores
Árvores
Algoritmos de Ordenação
Elementos Não-Funcionais
Seminco – 2006
Blumenau - SC
Capítulos
15.
16.
17.
A.
B.
Entradas, Saídas e Seqüências de Ações
Problemas
Reflexões Finais
Ambientes de Programação
Funções Complementares
Seminco – 2006
Blumenau - SC
Um estudante
Seminco – 2006
Blumenau - SC
Uma editora: um projeto!
Uma idealização efetivada
Seminco – 2006
Blumenau - SC
Futuro
• A verticalização: aplicações e melhorias
• A comunidade se amplia
Seminco – 2006
Blumenau - SC
Referências
• 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/PaginaDoLivr
oDeHaskell
Seminco – 2006
Blumenau - SC
Muito Obrigado !
Seminco – 2006
Blumenau - SC
Download