[Haskell-cafe] Question about instance

John Velman velman at cox.net
Thu Jan 13 19:29:37 EST 2005


Instance with a context doesn't seem to work as I expect.

Here's the story:

I define an data type, Relation, and I want to make it an instance of
"Show", partly so I can debug and tinker with things interactively and have
ghci print something.

Here is my first try:
----
>
>import Data.Set
>
>type EN = String  -- element name
>
>type RN = String  -- relation name
>
>instance Show a => Show (Set a) where
>   show s = "mkSet " ++ show (setToList s) 
>
>data Relation  = Relation {name::RN, arity::Int, members::(Set [EN])}
>
>instance (Show a, Show i, Show b) => Show (Relation a i b)
>   where
>     show (Relation a i b) =
>                    a ++ "/" ++ (show i) ++ " "
>                    ++ (show b)
----

When I try to load this into ghci, I get:

---GHCI:

*Main> :l test.hs
Compiling Main             ( test.hs, interpreted )

test.hs:14:
    Kind error: `Relation' is applied to too many type arguments
    When checking kinds in `Relation a i b'
    When checking kinds in `Show (Relation a i b)'
    In the instance declaration for `Show (Relation a i b)'
Failed, modules loaded: none.
Prelude>
---END GHCI
But, when I define showRelation separately, then leave the context out of
the instance declaration with show = showRelation it works:

-----------(Everything down to the instance declaration is the same)
>instance  Show Relation 
>   where
>     show = showRelation
>
>showRelation:: Relation -> String
>showRelation (Relation a i b) =
>                    a ++ "/" ++ (show i) ++ " "
>                    ++ (show b)
>
-----------

Now I get:
----------- GHCI output:
Prelude> :l test.hs
Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> mkRelation1 "test" 2 [["one","two"], ["three","four"]]
test/2 mkSet [["one","two"],["three","four"]]
*Main> 
---------- End GHCI

Why does the original instance declaration result in failure and the
message "Kind error: `Relation' is applied to too many type arguments" (I
confess to not understanding 'kinds' too well.)

I've done a bit of tinkering with the original version, and have tried the
second version with a context in the instance declaration, but none of my
attmepts work.  The only one that worked was the one shown, with no context
in the instance declaration.  Needless to say (?), I've tried to
understand this from reading in the Haskell 98 report, `Haskell school of
Expression', and any place else I can think of, but I'm missing the point
somewhere.  


Thanks,

John Velman


More information about the Haskell-Cafe mailing list