haskell-cafe@haskell.org
[Top] [All Lists]

Re: [Haskell-cafe] Re: GATD and pattern matching

Subject: Re: [Haskell-cafe] Re: GATD and pattern matching
From: Daniel Fischer
Date: Thu, 10 Jun 2010 23:14:42 +0200
On Thursday 10 June 2010 22:01:38, Dupont Corentin wrote:
> Hello Maciej,
> i tried this out, but it didn't worked.
>
> Daniel,
>
> I added a (Show a) constraint to Equal:
> > data Obs a where
> >     Player :: Obs Integer
> >     Turn :: Obs Integer
> >     Official :: Obs Bool
> >     Equ :: (Show a, Eq a) => Obs a -> Obs a -> Obs Bool
>
> --woops!!
>
> >     Plus :: (Num a) => Obs a -> Obs a -> Obs a
> >     Time :: (Num a) => Obs a -> Obs a -> Obs a
> >     Minus :: (Num a) => Obs a -> Obs a -> Obs a
> >     Konst :: a -> Obs a
> >     And :: Obs Bool -> Obs Bool -> Obs Bool
> >     Or :: Obs Bool -> Obs Bool -> Obs Bool
>
> It works for the Show instance, but not Eq.
> By the way, shouldn't the Show constraint be on the instance and not on
> the datatype declaration?

Can't be here, because of 
  Equ :: Obs a -> Obs a -> Obs Bool

You forget the parameter a, and you can't recover it in the instance 
declaration. So you have to provide the Show instance for a on 
construction, i.e. put the constraint on the data constructor.

> I'd prefer to keep the datatype as generic as possible...
>
> There is really no way to make my Obs datatype an instance of Eq and
> Show??

Show can work (should with the constraint on Equ), Eq is hairy.

instance Show t => Show (Obs t) where
    show (Equ a b) = show a ++ " `Equal` " ++ show b
    show (Plus a b) = ...
    show (Konst x) = "Konst " ++ show x
    ...

For an Eq instance, you have the problem that

Equ (Konst True) (Konst False)
and
Equ Player Turn

both have the type Obs Bool, but have been constructed from different 
types, so you can't compare (Konst True) and Player.
I don't see a nice way to work around that.

>
> I searched around a way to add type information on the pattern match 
like:
> > instance Show t => Show (Obs t) where
> >     show (Equal (a::Obs t) (b::Obs t)) = (show a) ++ " Equal " ++
> > (show b) show (Plus a b) = (show a) ++ " Plus " ++ (show b)
>
> But it doesn't work.
>
> thanks for your help,
> Corentin
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@xxxxxxxxxxx
http://www.haskell.org/mailman/listinfo/haskell-cafe

<Prev in Thread] Current Thread [Next in Thread>