• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

necrodust

instancias

8 mensagens neste tópico

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Na instância não são definidos os tipos, apenas é definida uma forma de verificar a igualdade entre valores desses tipos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

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