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