Introdução à Programação:
uma Abordagem Funcional
PD I – Engenharia Elétrica
Prof.ª Claudia Boeres
2008/2
A linguagem de programação
Haskell e o ambiente Hugs

linguagem Haskell:


oferece uma sintaxe simples e elegante;
ambiente HUGS:
uma implementação da linguagem de programação funcional
Haskell;
 provê um avaliador de expressões descritas por funções

o avaliador funciona por meio de um interpretador, que
interpreta as expressões para o computador

Avaliador do ambiente HUGS
Ambiente HUGS
avaliador: pode ser usado como uma
calculadora:
?3+5*2
13
? (3 + 5) * 2
16
?
 primitivas: funções já existentes em bibliotecas
do HUGS

Primeiras operações e primitivas...
Operador
Denominação
Número de
argumentos
notação
exemplo
+
soma
binário
infixada/
pré-fixada
2+3
(+) 2 3
-
Subtração/
simetria
binário/
unário
infixada/
pré-fixada
5–2
(-) 5 2
-3
*
multiplicação
binário
infixada/
pré-fixada
7*3
(*) 7 3
/
divisão
binário
infixada/
pré-fixada
5/2
(/) 5 2
^
potência
binário
infixada/
pré-fixada
2^2
(^) 2 2
div
divisão inteira
binário
pré-fixada
div 5 2
mod
resto da divisão binário
inteira
pré-fixada
mod 5 2
Exemplo
Hugs> 4 * 3 – 2
10
exemplo1.hs
fx=x+1
Hugs> f 2 + 10
ERROR - Undefined variable "f"
Hugs>:load “c:\boeres\exemplo1.hs”
Main> f 2 + 10
13
hugs
Descrição de funções
Scripts: Funções devem ser descritas em um arquivo texto.
f
x y
=
x*y
nome
da
parâmetros
função
expressão aritmética que
define a relação que há entre
os parâmetros
interface da função
corpo da definição
Interações do programador com o
ambiente de programação
Editor de
texto
Arquivo texto
com definições
de funções
Ambiente
Interpretador
HUGS
Programador
Exemplo: Cálculo da hipotenusa de
um triângulo retângulo
Dados os catetos a e b de um triângulo
retângulo, calcular a sua hipotenusa.
hugs
Definições locais
restritas ao contexto específico da definição de
uma função.


Exemplo:
hipo x y = sqrt (quad x + quad y)
where
quad x = x * x
Definições locais – mais exemplos
hipo1 x y = sqrt (k1 + k2)
where
k1 = x * x
k2 = y * y
hipo2 x y = sqrt (k1 + k2)
where
k1 = x * x; k2 = y * y
hipo3 x y = sqrt k
where
k = quad x + quad y
where
quad x = x * x
Avaliação de expressões
ordem expressão
redução aplicada
1
2
3
hipo 3 5 + hipo 4 4
sqrt ( quad 3 + quad 5) + hipo 4 4
sqrt ( 3 * 3 + quad 5) + hipo 4 4
expressão inicial
def de hipo
def de quad
4
5
6
sqrt (3 * 3 + 5 * 5) + hipo 4 4
sqrt (3 * 3 + 5 * 5) + sqrt (quad 4 + quad 4)
sqrt (3 * 3 + 5 * 5) + sqrt (4 * 4 + quad 4)
def de quad
def de hipo
def de quad
7
8
9
10
11
12
13
14
15
16
sqrt (3 * 3 + 5 * 5) + sqrt (4 * 4 + 4 * 4)
sqrt (9 + 5 * 5) + sqrt (4 * 4 + 4 * 4)
sqrt (9 + 25) + sqrt (4 * 4 + 4 * 4)
sqrt 34 + sqrt (4 * 4 + 4 * 4)
5.83095 + sqrt (4 * 4 + 4 * 4)
5.83095 + sqrt (16 + 4 * 4)
5.83095 + sqrt (16 + 16)
5.83095 + sqrt (32)
5.83095 + 5.65685
11.4878
def de quad
*
*
+
sqrt
*
*
+
sqrt
+
Assinatura de funções e a notação
Curry

Para conhecer o tipo de uma função,
disponível na biblioteca do HUGS ou construída
pelo programador, basta usar, no ambiente
HUGS, o comando:
Hugs> :t <nome da função>
Exemplos
Hugs> :t sqrt
sqrt :: Floating a => a -> a
Hugs> :t sin
sin :: Floating a => a -> a
Hugs> :t abs
abs :: Num a => a -> a
Hugs> :t mod
mod :: Integral a => a -> a -> a
Hugs> :t div
div :: Integral a => a -> a -> a
Exemplo: média aritmética de três
números reais

definição: ma3 x y z = (x + y + z)/3

assinatura: ma3 :: xx  

notação curry:

toda função tem sempre um único parâmetro de
entrada
 a aplicação de uma função sobre um parâmetro
produz uma nova função
 assinatura: ma3 ::      
Máquina Funcional
ma3 3 4 5
 “(x + y + z)/3” 4 5
 “( 3 + y + z)/3” 4 5
 “(3 + 4 + z)/3” 5
 “(3 + 4 + 5)/3”
 “(7 + 5)/3”
 “12/3”
4
Download

Slide 1 - claudiaboeres