pr0zin Posted February 23, 2013 at 11:30 AM Report #496724 Posted February 23, 2013 at 11:30 AM (edited) Bons dias, eu tenho uma duvida num exercicio(estou a iniciar a programaçao em haskell) O que eu pretendia era verificar se 3 numeros constituem um triangulo. em C isto era muito facil, mas em haskell eu nao sei muito bem como isto funciona. Podem me ajudar/corrigir? Bool :: triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) return True; else return False; Edited February 23, 2013 at 02:35 PM by Baderous
brunoais Posted February 23, 2013 at 11:38 AM Report #496725 Posted February 23, 2013 at 11:38 AM Podem me ajudar/corrigir? Bool :: triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) return True; else return False; Acho que seria algo mais... (não testado) triangulo a b c = if ((a + b) > c) || (a + c) > b) || (b + c) > a)) then True else False "[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31 Life is a genetically transmitted disease, induced by sex, with death rate of 100%.
pr0zin Posted February 23, 2013 at 11:45 AM Author Report #496726 Posted February 23, 2013 at 11:45 AM (edited) ja consegui resolver! triangulo :: Int -> Int -> Int -> Bool triangulo a b c = if(a + b)>c then True else if(a + c)>b then True else if(b + c)>a then True else False obrigado 😛 Edited February 23, 2013 at 04:25 PM by thoga31 GeSHi
thoga31 Posted February 23, 2013 at 04:32 PM Report #496750 Posted February 23, 2013 at 04:32 PM Atenção! Convém referir isto: o return do Haskell não tem o mesmo significado que o return de outras LP's, como C! O return do Haskell é utilizado para outros fins totalmente distintos. Para este caso, eu recomendo o uso de guards, fica muito mais legível 😉 triangulo :: (Num a, Ord a) => a -> a -> a -> Bool triangulo a b c | (a + b) > c = True | (a + c) > b = True | (b + c) > a = True | otherwise = False Também alterei o tipo de dados de entrada de modo à função ter um alcance a mais tipos de dados, neste caso que são numéricos e "comparáveis pela ordem". Agora uma outra questão: isto é suposto fornecer 3 números e verificar se eles constituem os lados de um triângulo? É que se for isso, estas condições são insuficientes. Cumprimentos. Knowledge is free!
pwseo Posted February 23, 2013 at 08:01 PM Report #496775 Posted February 23, 2013 at 08:01 PM (edited) Se calhar para quem está a começar é melhor utilizar tipos de dados concretos (ex.: Integer), porque nem sempre estamos completamente a par de todas as type classes necessárias para o que queremos fazer. Uma boa solução é deixar o Haskell inferir o tipo de dados e depois usarmos isso como base para uma assinatura mais específica. A tua solução falha porque estás a utilizar o operador ou (||) em vez do e (&&). Aqui ficam soluções com piada (sem corrigir directamente o código do OP): import Data.List (permutations) -- 'dt' vem de "desigualdade triangular" dt a b c = and $ map (\[a,b,c] -> a + b > c) (permutations [a,b,c]) -- outra solução, sem 'permutations' dt a b c = and [ a + b > c, a + c > b, b + c > a ] Em ambos os casos, o tipo de dados inferido pelo compilador é dt :: (Num a, Ord a) => a -> a -> a -> Bool, mas poderíamos utilizar uma assinatura mais específica como dt :: Int -> Int -> Int -> Bool ou então dt :: Integer -> Integer -> Integer -> Bool. A vantagem de utilizar a assinatura geral (ou deixar o compilador inferir o tipo de dados) é que podemos utilizar a função com outros tipos de dados, como já foi referido pelo thoga31. Edited February 23, 2013 at 08:15 PM by pwseo
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now