
{-- I try to define class Store that will group types implmenting different storage mechanisms . All types should support two functions: 1) put (key, value) pair into storage 2) get value from storage corresponding to the given key As an example I start with the following storage types: --} -- simple memory cell data OneCell k v = Cell(k, v) -- list of cells data CellList k v = CLst [(k, v)] {-- First, without grouping these types into any class, just to illustrate what these types should do, I define the following functions: --} {-- put::(k, v) -> OneCell k v -> OneCell k v put (k1, v1) (Cell(k, v)) = Cell(k1, v1) get :: Eq k => k -> OneCell k v -> Maybe v get k (Cell (_, v)) = Just v c1 ::OneCell String Int c1 = Cell("one", 1) putLst :: (k,v) -> CellList k v -> CellList k v putLst (k,v) (CLst xs) = CLst ((k,v) : xs) getLst :: Eq k => k -> CellList k v -> Maybe v getLst k (CLst xs) = lookup k xs cl1 = CLst [("one",1),("two",2),("three",3)] --} {-- These work as expected. Now I try to define Store class that should allow me to overload put & get functions: --} class Store s where put :: Eq k => (k, v) -> s -> s get :: k s -> Maybe v {-- instance Store OneCell where put (k1, v1) (Cell(k, v)) = Cell(k1, v1) get k (Cell (_, v)) = Just v --} {-- I get the following error: `OneCell' is not applied to enough type arguments Expected kind `*', but `OneCell' has kind `* -> * -> *' In the instance declaration for `Store OneCell' --} instance Store CellList where put (k,v) (CLst xs) = CLst ((k,v) : xs) get k (CLst xs) = lookup k xs {-- I get the following error: `CellList' is not applied to enough type arguments Expected kind `*', but `CellList' has kind `* -> * -> *' In the instance declaration for `Store CellList' --} What should I do to create Store class? Thanks! -- Dmitri O. Kondratiev dokondr@gmail.com http://www.geocities.com/dkondr