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