Jump to content
nuno35

Funções com Tipos de dados

Recommended Posts

nuno35

Boa Tarde, preciso aqui de uma ajuda tenho estes dois tipos de dados e estou a tentar fazer estas 3 funções ate agr tenho este codigo se alguem me conseguir dar uma ajuda

Data Cor = Vermelho | Azul | Cinzento deriving Show
Data Carro = Carro cor (Maybe Carro) deriving Show

Basicamente pode ir havendo um carro dentro do outro

1 - Recebe um tipo de dado carro e devolve uma lista com todas as cores
 

Lista_Cores :: Carro -> [Cor]
Lista_Cores Carro c (Nothing) = [c]
Lista_Cores Carro c (Car) = [c] : Lista_Cores Car

2 - Recebe um cor um tipo de dado carro e devolve numero de carros com cor = cor 
 

Num_Cor :: Cor -> Carro -> Int
Num_Cor cor Carro c (Nothing) = if cor == c then 1 else 0
Num_Cor cor Carro c (Car)=  if cor == c then 1 + Num_Cor cor Car

3 - O tipo de dados Cor ser Eq gerada pelo par Vermelho == Azul nao percebo bem esta parte de ser gerada por este par 

 

Desde ja Obrigado 

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
Baderous

Quando te pede para o tipo de dados Cor ser um Eq está-te a pedir que tornes esse tipo numa instância da classe Eq: https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#t:Eq

Como podes ver pela definição, para teres um tipo declarado como instância da classe Eq, tens de fornecer como implementação mínima a função (==) ou (/=) (i.e., igual ou diferente: indicar quando duas Cores são iguais ou diferentes). No enunciado, pede-te para consideres que 2 cores são iguais quando uma for Vermelho e a outra Azul, portanto:

data Cor = Vermelho | Azul | Cinzento deriving Show

instance Eq Cor where
        (==) Vermelho Azul = True
        (==) Azul Vermelho = True
        (==) _ _ = False

Só te interessa indicar que é verdade quando uma é Vermelho e a outra Azul, podendo variar a ordem. Tudo o resto é para considerar falso. Assim, para verificar esta implementação, poderias criar os seguintes testes:

*Main> let c1 = Vermelho
*Main> let c2 = Vermelho
*Main> let c3 = Azul
*Main> let c4 = Cinzento
*Main> c1 == c2
False
*Main> c1 == c3
True
*Main> c3 == c1
True
*Main> c1 == c4
False
*Main> c3 == c4
False

Nota: atenção ao case-sensitive nas palavras reservadas. "Data" não é o mesmo que "data".

Share this post


Link to post
Share on other sites

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.