Jump to content

Recommended Posts

Posted (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 by Baderous
Posted

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%.

Posted (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 by thoga31
GeSHi
Posted

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!

Posted (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 by pwseo

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.