Hi! I'm pretty (not to say very) new to haskell and i've to create a new class named container that includes types that hold other values, more specific, i have "created" this two types:
data Abb a b = Branch a b (Abb a b) (Abb a b) | Leaf
and
data ListAssoc a b = Node a b (ListAssoc a b) | Empty
and implemented some common functions (add, search, delete, empty,etc). So when I was asked to create this new class I crashed against a big problem, or at least for me. My first attempt was:
class Container c where
empty :: c
but when I had to implement "add" I tried
add :: c -> a -> b -> c
although I was almost sure that it wouldn't work, so I realized that I had to give Container not one but three parameters, the container and the types of values that the container saved so I started searching and I found similar cases, but the difference iis that in this cases the class was defined as follows:
class Container c e | c->e where
empty :: c
insert :: c -> e -> c
member :: c -> e -> Bool
but my particular problem here is that the types I designed hold two values of different type and these holds just one value. Besides I knew nothing about functional dependency used in here and I keep knowing almost nothing about them, but I tried something like this:
class Container c a b |c -> a, c -> b where
empty :: c
add :: c -> a -> c
search :: c -> a -> Maybe b
del :: c -> a -> c
toListPair :: c -> [(a,b)]
instance Container Abb a b where
empty = Leaf
add Leaf x y = Branch x y Leaf Leaf
add arb@(Branch ni nd ri rd) x y |x == ni = arb
|x > ni = Branch ni nd ri (add rd x y)
|otherwise = Branch ni nd (add ri x y) rd
search Leaf x = Nothing
search (Branch ni nd ri rd) x |x == ni = Just nd
|x > ni = search rd x
|x < ni = search ri x
but when I try to load it in WinHugs I get the following error message:
- Instance is more general than a dependency allows
*** Instance : Container Abb a b
*** For class : Container a b c
*** Under dependency : a -> b
and as I have stated above my knowledge about dependencies is almost null, not to say null, so I donīt even have an idea where the error is. A suggestion that I've received was to change the type of Abb for
data Abb (a,b) = Branch a b (Abb (a,b)) (Abb (a,b)) | Leaf
and declare container class with just two parameters like I found in all pages I visited. I have not tried this yet, as I still have hope that what I intend to do is possible.
Well if you have any suggestions I'd appreciate you send it to me and sorry for bothering you and my english, but i'm "spanish-speaker".