<pre style="font-family:arial,helvetica,sans-serif"><font><span style="font-family:courier new,monospace" class="hs-comment">{- I'm writing code to do some combinatorial construction via test-and-evaluate
algorithms. And I want to write a very generic algorithm. The idea is that the item being constructed has a current state, which is represented by a data type of typeclass EvalState. And the algorithm will consider a set of new elements to add to the object being constructed, represented by a data type of typeclass ElemSet. Here are the class definitions:
-}</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">class</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyword">where</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">elemSetNumElements</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Int</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">class</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">EvalState</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyword">where</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">isCompleteState</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Bool</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">newElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">integrateElem</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Int</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-comment">-- given an elem set, and an index of the elem to choose , compute a score</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">scoreElem</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">a</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Int</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">EvalScore</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">type</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">EvalScore</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Float</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">type</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">RandomnessChooser</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">[</span><span style="font-family:courier new,monospace" class="hs-layout">(</span><span style="font-family:courier new,monospace" class="hs-conid">EvalScore</span><span style="font-family:courier new,monospace" class="hs-layout">,</span><span style="font-family:courier new,monospace" class="hs-conid">Int</span><span style="font-family:courier new,monospace" class="hs-layout">)</span><span style="font-family:courier new,monospace" class="hs-keyglyph">]</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ErrorRand</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">Int</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-comment">{- here's my generic search algorithm written using the typeclasses
the problem I'm having relates to the fact that I need to call 'integrateElem' which is a function in typeclass EvalState, and one of the arguments has the constraint of being of typeclass ElemSet, but I don't know how to put that constraint in.
The specific error is
"Ambigous type variable 'a' in the constraint: 'ElemSet a' arising from a use of 'integrateElem'"
-}</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-definition">search</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">::</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-layout">(</span><span style="font-family:courier new,monospace" class="hs-conid">EvalState</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace" class="hs-layout">)</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=></span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-conid">RandomnessChooser</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">-></span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-conid">ErrorRand</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">s</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-definition">search</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">chooser</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyword">do</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">if</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">isCompleteState</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">then</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">return</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">else</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyword">do</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">let</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">elemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">newElemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">n</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">elemSetNumElements</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">elemSet</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">scores</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">map</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">g</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">[</span><span style="font-family:courier new,monospace" class="hs-num">0</span><span style="font-family:courier new,monospace" class="hs-keyglyph">..</span><span style="font-family:courier new,monospace" class="hs-varid">n</span><span style="font-family:courier new,monospace" class="hs-comment">-</span><span style="font-family:courier new,monospace" class="hs-num">1</span><span style="font-family:courier new,monospace" class="hs-keyglyph">]</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">g</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">i</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-layout">(</span><span style="font-family:courier new,monospace" class="hs-varid">scoreElem</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">elemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">i</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace" class="hs-layout">,</span><span style="font-family:courier new,monospace" class="hs-varid">i</span><span style="font-family:courier new,monospace" class="hs-layout">)</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">chosenElemIdx</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph"><-</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">chooser</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">scores</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-keyword">let</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">newState</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-keyglyph">=</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">integrateElem</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">elemSet</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">chosenElemIdx</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">state</span><span style="font-family:courier new,monospace">
</span><span style="font-family:courier new,monospace" class="hs-varid">search</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">chooser</span><span style="font-family:courier new,monospace"> </span><span style="font-family:courier new,monospace" class="hs-varid">newState</span></font></pre>