Hi! I&#39;m pretty (not to say very) new to haskell and i&#39;ve to create a new class named container that includes types that hold other values, more specific, i have &quot;created&quot; this two types:<br><br>data Abb a b = Branch a b (Abb a b) (Abb a b) | Leaf<br>
and<br>data ListAssoc a b = Node a b (ListAssoc a b) | Empty<br><br>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:<br>
<br>class Container c where<br>empty :: c<br><br>but when I had to implement &quot;add&quot; I tried<br><br>add :: c -&gt; a -&gt; b -&gt; c<br><br>although I was almost sure that it wouldn&#39;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:<br>
<br>class Container c e | c-&gt;e where<br>empty :: c<br>insert :: c -&gt; e -&gt; c<br>member :: c -&gt; e -&gt; Bool<br><br>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:<br>
<br>class Container c a b |c -&gt; a, c -&gt; b&nbsp; where<br><br>empty :: c<br>add :: c -&gt; a -&gt; c<br>search :: c -&gt; a -&gt; Maybe b<br>del :: c -&gt; a -&gt; c<br>toListPair :: c -&gt; [(a,b)]<br><br>instance Container Abb a b where<br>
<br>empty = Leaf<br><br>add Leaf x y = Branch x y Leaf Leaf<br>add arb@(Branch ni nd ri rd) x y&nbsp;&nbsp;&nbsp; |x == ni = arb<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |x &gt; ni = Branch ni nd ri (add rd x y)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; |otherwise = Branch ni nd (add ri x y) rd<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>search Leaf x&nbsp; = Nothing <br>search (Branch ni nd ri rd) x&nbsp;&nbsp;&nbsp; |x == ni = Just nd<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; |x &gt; ni = search rd x<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |x &lt; ni = search ri x<br>
<br>but when I try to load it in WinHugs I get the following error message:<br><br>- Instance is more general than a dependency allows<br>*** Instance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Container Abb a b<br>*** For class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Container a b c<br>
*** Under dependency : a -&gt; b<br><br>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&#39;ve received was to change the type of Abb for <br>
<br>data Abb (a,b) = Branch a b (Abb (a,b)) (Abb (a,b)) | Leaf<br><br>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.<br>
<br>Well if you have any suggestions I&#39;d appreciate you send it to me and sorry for bothering you and my english, but i&#39;m &quot;spanish-speaker&quot;.<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>