Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouGeovane Menezes Alterado mais de 10 anos atrás
1
Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres boeres@inf.ufes.br CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Co-Autoria: Clebson Oliveira
2
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.
3
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:
4
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:
5
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;
6
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
7
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
8
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
9
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
10
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
11
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
12
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)
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.