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
Download

Introdução a Haskell - Programa de Pós