Ir para o conteúdo
necrodust

instancias

Mensagens Recomendadas

necrodust    0
necrodust

tenho uma duvida sobre o seguinte exercicio:

Considere as seguintes declarações de tipo usadas para representar as horas de um dia nos

formatos usuais.

data Part = AM | PM
deriving (Eq, Show)

data TIME = Local Int Int Part
| Total Int Int

3. Defina TIME como instância da classe Eq de forma a que a igualadade entre horas seja

independente do formato em que hora está guardada.

nao sei o que tenho de fazer, se tenho de apaguar os tipos e tnho de defini-los na instancia, se tenho de fazer de outra forma...

eu fiz o seguinte mas não está a resultar

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = (xl == (xt+12)) && (yl == yt)

alguem me consegue dar uma luz?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Bem precisas ainda de dizer como comparar entre 2 Local e entre 2 Total.

Para além do inverso, ou seja, também (Total ..) == (Local ..)

A ordem dos argumentos importa.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
necrodust

fiz o seguinte

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = ((xl+12) == xt) && (yl == yt)
  (Total xt yt) == (Local xl yl AM) = (xt == xl) && (yt == yl)
  (Total xt yt) == (Local xl yl PM) = (xt == (xl+12)) && (yt == yl)

desta forma parece estar a funcionar!

so tenho mais uma duvida, os tipos ficam definidos tal qual como estao, isto é, fora da instancia?

ou tenho k melhorar isso e definir dentro da propria instancia?

obrigado pela ajuda, ja foi um bom empurão pra mim  :D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

fiz o seguinte

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = ((xl+12) == xt) && (yl == yt)
  (Total xt yt) == (Local xl yl AM) = (xt == xl) && (yt == yl)
  (Total xt yt) == (Local xl yl PM) = (xt == (xl+12)) && (yt == yl)

desta forma parece estar a funcionar!

Cuidado que irá dar erro se fores comparar por exemplo

(Local 10 15 AM) == (Local 10 15 AM)

Também não precisas de repetir a lógica de comparação duas vezes, podes fazer antes:

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = ((xl+12) == xt) && (yl == yt)
  a@(Total _ _) == b@(Local _ _ _) = b == a

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
necrodust

Cuidado que irá dar erro se fores comparar por exemplo

(Local 10 15 AM) == (Local 10 15 AM)

Também não precisas de repetir a lógica de comparação duas vezes, podes fazer antes:

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = ((xl+12) == xt) && (yl == yt)
  a@(Total _ _) == b@(Local _ _ _) = b == a

pois, n tinha pensado nisso...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
necrodust    0
necrodust

assim acho que ja funciona como deve ser

instance Eq TIME where
  (Local xl yl AM) == (Total xt yt) = (xl == xt) && (yl == yt)
  (Local xl yl PM) == (Total xt yt) = ((xl+12) == xt) && (yl == yt)
   a@(Total _ _) == b@(Local _ _ _) = b == a
  (Local xl yl z) == (Local xl2 yl2 z2) = (xl == xl2) && (yl == yl2) && (z == z2)
  (Total x y) == (Total x2 y2) = (x == x2) && (y == y2)

obrigado  :D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade