[Haskell-cafe] [Q] multiparam class undecidable types

oleg at okmij.org oleg at okmij.org
Wed May 9 08:41:00 CEST 2012

> | instance (Table a c, Show c) => Show a where
> I would have thought that there is on overlap: the instance in my code
> above defines how to show a table if the cell is showable;

No, the instance defines how to show values of any type; that type
must be an instance of Table. There is no `if' here: instances are
selected regardless of the context such as (Table a c, Show c)
above. The constraints in the context apply after the selection, not

Please see 
	``Choosing a type-class instance based on the context''

for the explanation and the solution to essentially the same problem.

There are other problems with the instance:

| instance (Table a c, Show c) => Show a where

For example, there is no information for the type checker to determine
the type c. Presumably there could be instances
	Table [[Int]] Int
	Table [[Int]] Bool
So, when the a in (Table a c) is instantiated to [[Int]] 
there could be two possibilities for c: Int and Bool. You can argue
that the type of the table uniquely determines the type of its
cells. You should tell the type checker of that, using functional
dependencies or associated types:

	class Table table where
	  type Cell table :: *
	  toLists :: table -> [[Cell table]]

More information about the Haskell-Cafe mailing list