
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
participants (1)
-
John Velman