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

necrodust

instancias

Recommended Posts

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?

Share this post


Link to post
Share on other sites
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.


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other sites
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


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
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...

Share this post


Link to post
Share on other sites
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

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

×

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.