@Rafaela Soares,
A forma que utilizaste para resolver mostra que não compreendeste bem o conceito da definição de uma função. Tens 3 definições exactamente iguais de dist, apenas mudaste os nomes das variáveis; para o compilador, escreveste exactamente a mesma coisa em cada uma das linhas onde definiste dist. A única definição que precisavas era:
dist :: Ponto -> Ponto -> Float
dist (x1,y1) (x2,y2) = sqrt ( (x2-x1)^2 + (y2-y1)^2 )
Como se pode ver, dist não precisa de saber quais os pontos que lhe passaste. Basta que receba quaisquer dois pontos para que depois te devolva o valor da distância entre eles.
Depois, bastaria utilizar essa função na definição de compr. No entanto, também nesta parte foste demasiado exaustiva (só precisavas de referir que a função recebe os argumentos a b c em vez dos tuplos (a,b) (c,d) (e,f)), bastando na realidade o seguinte:
compr :: Ponto -> Ponto -> Ponto -> (Float, Float, Float)
compr a b c = (dist a b, dist b c, dist c a)
Da forma que fizeste é muito fácil perderes-te nos argumentos e fazer asneira ao confundir alguma das coordenadas/argumentos. Da forma que eu mostrei ser mais adequada reduzes muito a possibilidade de erro, e a leitura do código fica também muito mais fácil.
Adicionalmente, podes definir dist apenas no contexto de compr, assim:
compr :: Ponto -> Ponto -> Ponto -> (Float, Float, Float)
compr a b c = (dist a b, dist b c, dist c a)
where
dist (x1,y1) (x2,y2) = sqrt ( (x2-x1)^2 + (y2-y1)^2 )
↧