[Haskell-cafe] What's wrong with the classes/insances?

Dan Weston westondan at imageworks.com
Fri Jun 20 18:25:48 EDT 2008


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
> 




More information about the Haskell-Cafe mailing list