{--<br>Thanks!<br>Yes, you got it right - I &quot;want to make explicit the fact that the type s depends on k and v.<br>So I followed your advice and used the most simple way to do what I need:<br>--}<br><br>class Store s where<br>
&nbsp;&nbsp;&nbsp; put :: Eq k =&gt; (k, v) -&gt; s k v -&gt; s k v <br>&nbsp;&nbsp;&nbsp; get :: Eq k =&gt; k -&gt; s k v -&gt; Maybe v<br><br>instance Store OneCell where<br>&nbsp;&nbsp;&nbsp; put (k1, v1) (Cell(k, v)) = Cell(k1, v1)<br>&nbsp;&nbsp;&nbsp; get k (Cell (_, v)) = Just v<br>
<br>instance Store CellList where<br>&nbsp;&nbsp;&nbsp; put (k,v) (CLst xs) = CLst ((k,v) : xs)<br>&nbsp;&nbsp;&nbsp; get k (CLst xs) = lookup k xs<br><br><br>storePut :: (Store s, Eq k)&nbsp; =&gt; s k v -&gt; k -&gt; v -&gt; s k v<br>storePut store key value = put (key, value) store <br>
<br>storeGet :: (Store s, Eq k) =&gt; k -&gt; s k v -&gt; Maybe v<br>storeGet key store = get key store<br><br>aCell :: OneCell String Int<br>aCell = Cell(&quot;one&quot;, 1)<br>lst :: CellList Int String<br>lst = CLst [(1, &quot;one&quot;),(2, &quot;two&quot;),(3, &quot;three&quot;)]<br>
<br>st1 = storePut aCell &quot;two&quot; 2<br>st2 = storePut lst 4 &quot;four&quot; <br><br>-- v1 = storeGet &quot;one&quot; st2 -- error<br>v2 = storeGet &quot;one&quot; st1 -- ok<br><br>{--<br>And what does the word &quot;newbie&quot; imply to you when answering my question?<br>
In what case using &#39;fundeps&#39; and &#39;associated types&#39; will make sence for this example?<br>--}<br><br>Thanks again for your great help!<br>Dima<br>&nbsp;<br><div class="gmail_quote">On Sat, Jun 7, 2008 at 11:11 PM, Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com">lrpalmer@gmail.com</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="Ih2E3d"><br>
</div>Oops. &nbsp;Should be:<br>
<br>
 &nbsp; &nbsp;get :: k -&gt; s k v -&gt; Maybe v<br>
<br>
And correspondingly for the later examples. &nbsp;After actually using my<br>
brain thinking about your problem, and reading the word &quot;Newbie&quot;, I<br>
would absolutely stay away from the fundeps/associated types business.<br>
&nbsp;:-) &nbsp;Try to get this working with Cell and CellList first :-)<br>
<font color="#888888"><br>
Luke<br>
</font><div><div></div><div class="Wj3C7c"></div></div></blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div class="Wj3C7c">
<br>
&gt; If instead you have cell types which are restricted in what they can<br>
&gt; store in different ways, you might explore fundeps or associated<br>
&gt; types:<br>
&gt;<br>
&gt; -- fundeps<br>
&gt; class Store s k v | s -&gt; k v where<br>
&gt; &nbsp; &nbsp;put :: (k,v) -&gt; s -&gt; s<br>
&gt; &nbsp; &nbsp;get :: s -&gt; Maybe v<br>
&gt;<br>
&gt; -- associated types<br>
&gt; class Store s where<br>
&gt; &nbsp; &nbsp;type Key s :: *<br>
&gt; &nbsp; &nbsp;type Value s :: *<br>
&gt; &nbsp; &nbsp;put :: (Key s, Value s) -&gt; s -&gt; s<br>
&gt; &nbsp; &nbsp;get :: s -&gt; Maybe (Value s)<br>
&gt;<br>
&gt; But if you can get away with the former, I would recommend that before<br>
&gt; looking into these advanced extensions.<br>
&gt;<br>
&gt; Luke<br>
&gt;<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Dmitri O. Kondratiev<br><a href="mailto:dokondr@gmail.com">dokondr@gmail.com</a><br><a href="http://www.geocities.com/dkondr">http://www.geocities.com/dkondr</a>