Folha 1
Programação Funcional, DCC/FCUP 11 de Fevereiro de 2013
Denição de funções simples
1.1
Considere as seguintes denições de funções:
inc x = x + 1
dobro x = x + x
quadrado x = x ∗ x
media x y = (x + y)/2
Efectuando reduções passo-a-passo, calcule os valores das expressões seguintes:
(a) inc (quadrado 5)
(b) quadrado (inc 5)
(c) media (dobro 3) (inc 5)
Num triângulo, verica-se sempre a seguinte condição: a medida de um
qualquer lado é menor que a soma da dos outros dois. Complete a denição de
uma função triangulo a b c = · · · que testa esta condição; o resultado deve ser
um valor boleano.
1.2
Escreva uma denição em Haskell duma função para calcular a área A de
um triângulo de lados a, b, c usando a fórmula de Heron:
1.3
A=
p
s(s − a)(s − b)(s − c) ,
onde s é metade do perímetro do triângulo.
Usando as funções do prelúdio-padrão dadas na primeira aula, escreva uma
função metades que divide uma lista de comprimento par em duas com metade
do comprimento. Exemplo: metades [1, 2, 3, 4, 5, 6, 7, 8] = ([1, 2, 3, 4], [5, 6, 7, 8]).
Investigue o acontece se a lista tiver comprimento ímpar.
1.4
1.5
(a) Mostre que a função last (que seleciona o último elemento de uma lista)
pode ser escrita como composição das funções do prelúdio-padrão apresentadas na primeira aula. Consegue encontrar duas denições diferentes?
(b) Mostre que a função init (que remove o último elemento duma lista) pode
ser denida analogamente de duas formas diferentes.
1
1.6
(a) Escreva uma função binom com dois argumentos que calcule o coeciente
binomial :
n
k
=
n!
k!(n − k)!
Sugestão : pode exprimir n! como product [1..n].
(b) Para todas as listas de números xs e ys, temos que product (xs++ys) =
product xs ∗ product ys. Use esta propriedade para re-escrever a denição
de forma mais eciente, eliminando factores comuns entre o numerador e
denominador.
Tipos e classes
1.7
Indique tipos admissíveis para os seguintes valores.
(a) [0 a0 , 0 b0 , 0 c0 ]
(b) (0 a0 , 0 b0 , 0 c0 )
(c) [(False, 0 00 ), (True, 0 10 )]
(d) ([False, True], [0 00 , 0 10 ])
(e) [tail , init, reverse]
(f) [id , not]
Indique o tipo mais geral para as seguintes denições; tenha o cuidado de incluir restrições de classes no caso de operações com sobrecarga.
1.8 (TP)
(a) segundo xs = head (tail xs)
(b) trocar (x, y) = (y, x)
(c) par x y = (x, y)
(d) dobro x = 2 ∗ x
(e) metade x = x/2
(f) minuscula x = x ≥ 0 a0 && x ≤ 0 z0
(g) intervalo x a b = x ≥ a && x ≤ b
(h) palindromo xs = reverse xs == xs
(i) twice f x = f (f x)
1.9 Indique exemplos de tipos concretos admissíveis e os tipos mais gerais
para cada uma das denições dos exercícios 1.1 e 1.2. Tenha o cuidado de
incluir apenas as restrições de classe estritamente necessárias.
2
Download

Folha 1 Definição de funções simples