420 likes | 744 Views
Linguagem Haskell. Riocemar S. de Santana . Haskell, o que é? É uma linguagem de programação puramente funcional , de propósito geral. Nomeada em homenagem ao matemático americano Haskell B. Curry (1900–1982 ).
E N D
Linguagem Haskell Riocemar S. de Santana
Haskell, o que é? • É uma linguagem de programação puramente funcional, de propósito geral. • Nomeada em homenagem ao matemático americano Haskell B. Curry (1900–1982). • Concebida para ensino e também para o desenvolvimento de aplicações reais. • Resultado de mais de vinte anos de investigação por uma comunidade de base acadêmica muito ativa. • Implementações abertas e livremente disponíveis. • Como uma linguagem funcional, a estrutura de controle primária é a função.
O que é a programação funcional? • É um paradigma de programação. • No paradigma imperativo, um programa é uma sequência de instruções que mudam células na memória. • No paradigma funcional, um programa é um conjunto de definições de funções que são aplicadas a valores. • Podemos programar num estilo funcional em muitas linguagens. • Exemplos: Scheme, ML, O’Caml, Haskell, F#
Programação Funcional • A programação funcional modela um problema computacional como uma coleção de funções matemáticas, cada uma com um domínio de entrada e um resultado. • As funções interagem e combinam entre si usando composição funcional, condições e recursão.
Linguagem Haskell Exemplo • Para somar os números inteiros de 1 a 10 podemos escrever em linguagem C: int total = 0, i; for (i = 1; i <= 10; i++){ total = total + i; } • O método da computação é baseado em atribuição de valores à variáveis.
Linguagem Haskell Exemplo • A soma dos números inteiros de 1 a 10 em linguagem Haskell pode ser feita como: >sum[1..10] • O método da computação é baseado em aplicação de argumentos à funções.
WinHugs • Hugs é uma implementação da linguagem Haskell que pode ser executada em PCse sistemas Unix, incluindo Linux. • Pode ser obtido gratuitamente emhttp://cvs.haskell.org/Hugs/pages/downloading.htm
WinHugs Suporte para: • Microsoft Windows • DebianGNU/Linux • Fedora Core (Linux) • OpenSUSE(Linux) • FreeBSD • Mac OS X
Haskell – Função • Uma função pode ser representada da seguinte maneira: • A partir dos valores de entrada á obtido o valor de saída.
Haskell – Função • Funções em Haskell são normalmente definidas pelo uso de equações. • Por exemplo, a função soma pode ser escrita: soma x y = x + y • Chamada da seguinte maneira: >soma 10 20 30
Haskell – Função • A função soma pode ser implementada em um arquivo (bloco de notas) e salvo com a extensão .hs
Haskell – Função • Carregando o arquivo de funções: Hugs>:load ”caminho”
Haskell – Função • Chamando a função soma: Main>soma 10 2
Haskell – Função • Incluindo mais funções no arquivo: incrementa n = n + 1
Haskell – Função • Função que chama uma função:
Hugs Alguns comandos importantes:
Tipos básicos • A linguagem Haskell possui uma disciplina rigorosa de tipos de dados, sendo fortemente tipada. Neste caso, toda função, variável, constante tem apenas um tipo de dado, que sempre pode ser determinado. • Embora fortemente tipada, a linguagem Haskell possui um sistema de dedução automática de tipos para funções cujos tipos não foram definidos. • A partir dos tipos pré-definidos na linguagem Haskell, novos tipos podem ser construídos pelo programador.
Tipos primitivos em Haskell • Para definir que uma expressão E tem o tipo T (E é do tipo T) escreve-se E::T-> Saida
Prototipação de tipos Exemplos: • -- Função que verifica se um número inteiro é par. par::Int->Bool par x = if mod x 2 == 0 thenTrue elseFalse • -- Função para converter um valor Fahrenheit em Celsius converteFC::Float->Float converteFCx = (x - 32)/ 1.8
Prototipação de tipos • Tipo Booleano: • O tipo booleano é representado pela abreviatura Bool e possui os valores: Trueou False. • Tipo Inteiro: • Os inteiros são referenciados por Int, o domínio matemático dos inteiros (até 2147483647).
Funções do módulo Prelude O arquivo de biblioteca Prelude.hs oferece um grande número de funções definidas no padrão da linguagem através do módulo Prelude. • even- verifica se um valor dado é par • odd- verifica se um valor dado é impar • rem- resto da divisão inteira • mod- resto da divisão inteira • ceiling- arredondamento para cima • floor- arredondamento para baixo • round- arredondamento para cima e para baixo • truncate- parte inteira do número • fromIntegral - converte um inteiro em real • sin - seno de ângulo em radianos • cos - cosseno • tan– tangente
Funções do módulo Prelude (Cont...) • asin- arco seno • acos- arco cosseno • atan- arco tangente • atan- arco tangente • abs- valor absoluto • sqrt- raiz quadrada, valor positivo apenas • exp- exponencial base e • log- logaritmo natural (base e) • logBase- logaritmo na base dada • min- menor de 2 objetos dados • max- maior de 2 objetos dados
Listas e Tuplas • A linguagem Haskell nos fornece dois mecanismos para a construção de dados compostos: listas e tuplas. • A lista possibilita a união de vários elementos – todos do mesmo tipo - numa única estrutura. • Numa tuplapodemos combinar os componentes de um dado numa única estrutura, e os componentes podem ter tipos e propriedades distintas
Listas Fundamento • Uma lista é uma estrutura de dados que representa uma coleção de objetos homogêneos em sequência. • Para alcançar qualquer elemento, todos os anteriores a ele devem ser recuperados. • Em programação, uma lista vazia (representada por [ ] em Haskell) é a estrutura base da existência de uma lista.
Listas Fundamento • Uma lista é composta sempre de dois segmentos: cabeça (head) e corpo (tail). A cabeça da lista é sempre o primeiro elemento. ['a','b','c','d'] "abcd" > 'a':['b','c','d'] "abcd“
Listas Operador (:) • O símbolo (:) é o operador de construção de listas. Toda lista é construída através deste operador. Exemplos: Hugs> 'a':['b','c','d'] "abcd" Hugs> 2:[4,6,8] [2,4,6,8]
Listas Hugs> 'a':['b','c','d'] "abcd" Hugs> 1:[2,3] [1,2,3] Hugs> ['a','c','f'] == 'a':['c','f'] True Hugs> [1,2,3] == 1:2:3:[] True Hugs> 1:[2,3] == 1:2:[3] True Hugs> "papel" == 'p':['a','p','e','l'] True
Escrevendo Listas • Pode-se definir uma lista indicando os limites inferior e superior de um conjunto conhecido, onde existe uma relação de ordem entre os elementos, no seguinte formato: [ <limite-inferior> .. <limite-superior> ] > [1..4] [1,2,3,4] > ['m'..'n'] "mn" > [1,3..6] [1,3,5] > ['a','d'..'p'] "adgjmp" > [3.1..7] [3.1,4.1,5.1,6.1,7.1]
Escrevendo Listas • Podemos definir qualquer progressão aritmética em uma lista utilizando a seguinte notação: [ <1o. termo>, <2o. termo> .. <limite-superior> ] > [7,6..3] [7,6,5,4,3] > [6,5..0] [6,5,4,3,2,1,0] > [-5,2..16] [-5,2,9,16] > [5,6..5] [5] > [1,1.1 .. 2] [1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0]
Listas por compreensão • A descrição de uma lista pode ser feita em termos dos elementos de uma outra lista. Por exemplo, temos a lista L1 = [2,4,7]. • Uma lista definida por compreensão pode ser escrita: > [ 2 * n | n <- L1 ] [4,8,14] • A lista resultante contém todos os elementos da lista L1, multiplicados por 2. Assim, podemos ler: Obtenha todos os 2*ndos elementos n contidos em L1 = [2,4,7].
Listas por compreensão • Exemplo: listaQuad= [x^2 | x <- [1..30]] >listaQuad [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,7 29,784,841,900] listaQuadInf = [ x^2 | x <- [1..] ] > listaQuadInf [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,7 29,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600 ... > elem 4 listaQuadInf True • A função elem verifica se um elemento pertence a uma lista. Retorna True ou False
Listas Funções Pré-definidas
Listas Funções Pré-definidas
Listas Funções Pré-definidas
Listas Funções Pré-definidas
Referências • http://www-usr.inf.ufsm.br/~juvizzotto/elc117-2010b/ • http://pt.wikipedia.org • http://www2.fct.unesp.br/docentes/dmec/olivete/lp/arquivos/Aula14.pdf Fim.