Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Co-Autoria: Clebson Oliveira
Validação de Dados Como sabemos, toda função tem um domínio e um contradomínio. No interpretador do Haskell, quando tentamos avaliar uma instância de uma definição, usando valores fora desse domínio, podemos receber como resposta mensagens nem sempre esclarecedoras; Quando se trata do usuário de nosso programa, este tipo de mensagem é ainda mais indesejável; Os programadores, que descrevem as funções, podem discernir com mais facilidade a natureza dos problemas que ocorrem durante o seu desenvolvimento; O mesmo não se pode esperar de alguém que não tem conhecimento dos elementos internos às descrições das nossas funções.
Tipos de Erro Tipicamente os erros são de duas naturezas. Pode ser que o tipo da instância esteja correto, mas nossa definição use alguma função primitiva que não se aplica ao valor da instância:
Tipos de Erro Outro tipo de problema ocorre quando o tipo de algum parâmetro da nossa instância não casa com o tipo inferido pelo interpretador. Por exemplo, se usamos um valor do tipo Float para y, obtemos:
Caracterização do Problema Desejamos construir uma função que seja uma extensão da função original (fx) e ao mesmo tempo lhe sirva como uma casca de proteção contra as violações de domínio;
Uma solução geral bastante conveniente é construir um novo contradomínio (NCD) para fx (extensão de f), formado por pares onde o primeiro elemento é do tipo boolean e o segundo do contradomínio de f: NCD(fx) = (boolean, CD(f)) Projeto da Solução
Para valores de x no domínio de f, teremos: fx x = (True, f x ) Para os valores de x fora do domínio teremos: fx x = (False, k ) » onde k é um valor qualquer pertencente ao contradomínio de f. Projeto da Solução
fx x y z = if invalido x y z then (False,0) else (True, f x y z) where invalido x y z =... f x y z = div x y + z Solução
Sabemos que o universo é definido pelos tipos dos três parâmetros (a, b, c), é maior que o domínio da função; Ou seja, a função não está definida para instâncias de a, b e c, onde se verifica a seguinte desigualdade: (b^2) + (4 * a * c) < 0 Exemplo – Raízes do 2º grau
Solução 1: re2gx a b c = (not (delta < 0), if delta < 0 then (0,0) else (x1, x2)) where delta = (b ^ 2) - (4 * a * c) x1 = ((-b) + sqrt delta) / (2 * a) x2 = ((-b) - sqrt delta) / (2 * a) Exemplo – Raízes do 2º grau
Solução 2: re2gx a b c = if delta < 0 then (False, (0, 0)) else (True, (x1, x2)) where delta = (b ^ 2) - (4 * a * c) x1 = ((-b) + sqrt delta) / (2 * a) x2 = ((-b) - sqrt delta) / (2 * a) Exemplo – Raízes do 2º grau
Faça uma função estendida para: f x y = 1/(x+y) Exercício fx x y = if invalido x y then (False,0) else (True, f x y) where invalido x y = x+y == 0 f x y = 1/(x+y)