I think the problem is here:

>     getCatalog :: Catalog catalog => a -> catalog

This wants to constrain the result of getCatalog to be an instance of Catalog, but this only works for function arguments, not results. The following code does typecheck, though I have no idea what is does or if it is what you want:


type Id = String

class Catalog a where
    listItems :: a -> IO [String]
    getItem :: a -> Id -> IO (Maybe String)

class Catalog q => Item q a where
    getCatalog :: a -> q

data Content d = MkContent {auteur  :: String,
                            inhoud  :: String,
                            catalog :: d}

instance Catalog c => Item c (Content c) where
   getCatalog (MkContent  _ _ e) = e



Pieter Laeremans wrote:
HI,

What 's wrong with this:

type Id = String

class Catalog a where
    listItems :: a -> IO [String]
    getItem :: a -> Id -> IO (Maybe String)

class Item a where
    getCatalog :: Catalog catalog => a -> catalog

data Catalog c => Content c = Content {auteur :: String, inhoud::
String, catalog::c}

instance Catalog c => Item (Content c) where
   getCatalog (Content  _ _ c) = c

I get this as error from ghci:

    Couldn't match expected type `catalog' against inferred type `c'
      `catalog' is a rigid type variable bound by
                the type signature for `getCatalog'
                  at
../Sites/liberaleswebsite/www.liberales.be/cgi-bin/Test.hs:16:26
      `c' is a rigid type variable bound by
          the instance declaration
            at ../Sites/liberaleswebsite/www.liberales.be/cgi-bin/Test.hs:20:17
    In the expression: c
    In the definition of `getCatalog': getCatalog (Content _ _ c) = c
    In the definition for method `getCatalog'
Failed, modules loaded: none.

thanks in advance,

P



_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to