Introdução a Haskell - Programa de Pós
Download
Report
Transcript Introdução a Haskell - Programa de Pós
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
WinHugs
Hugs é uma implementação da linguagem
Haskell que pode ser executada em PCs e
sistemas Unix, incluindo Linux.
Pode
ser
obtido
gratuitamente
em
http://cvs.haskell.org/Hugs/pages/downloa
ding.htm
WinHugs
Suporte para:
Microsoft Windows
Debian GNU/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 then True
else False
-- Função para converter um valor Fahrenheit em
Celsius
converteFC::Float->Float
converteFC x = (x - 32)/ 1.8
Prototipação de tipos
Tipo Booleano:
◦ O tipo booleano é representado pela abreviatura Bool e
possui os valores: True ou 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 tupla podemos 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
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.
os
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*n dos 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,28
9,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,28
9,324,361,400,441,484,529,576,625,676,7
29,784,841,900,961,1024,1089,1156,1225,1296,1369,144
4,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
Fim.
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/A
ula14.pdf