Allowing duplicate instances in GHC 6.4

Keean Schupke k.schupke at
Fri Mar 25 14:54:29 EST 2005

Just thought I ought to point out that all this is only necessary if the 
datasources may return different types... If you want them to return the 
same type you only need:

instance (Datasource l k v,Datasource r k v) => Datasource (JoinedDS l 
r) k v ...

As both datasources have the same key and value types, you then choose 
which 'v' to return at the value level.

I am not sure whether you intended Datasources to contain heterogeneous 
key or value types, and whether the loolup is supposed to be value or 
type driven. My original answer assumed a single Datasource contains 
values of different types, selected by the type of the key...


Robert van Herk wrote:

> Yes, but this is not what I want. I want to be able to give a key that 
> either the left or the right data source would take, and then return 
> the appropriate value. Thus: if I pass it a key that would normally go 
> into l, I want the value l returns me to be returned, and if I pass it 
> the key that would normally go into r, I want to return the value r 
> returns me.
> The datasource class has a function dsread :: ds -> k -> (ds, v) -- 
> read may have a side effect
> Thus I want want to do something like:
> instance (Datasource l k v) => Datasource (JoinedDS l r) k v where
>  dsread (JoinedDS l r) k = let (l, v) = dsread l k in (JoinedDS l r, v)
> instance (Datasource r k v) => Datasource (JoinedDS l r) k v where
>  dsread (JoinedDS l r) k = let (r, v) = dsread r k in (JoinedDS l r, v)
> It would be perfectly okay to me when the compiler would complain if 
> the key and value that go into l and r are the same, but for any 
> useful purpose I can think of (e.g. glueing two database couplings 
> together, since I also made a Datasource instance for database 
> access), this will not happen and the duplicate instances should not 
> really occur, since the context of the instances makes sure only 1 
> will be possible.
> However, GHC only looks at the RHS (thus: Datasource (JoinedDS l r) k 
> v) and then decides that both instances are the same.
> So, my question was: how to overcome this.
> Thanks,
> Robert

More information about the Glasgow-haskell-users mailing list