<pre style="font-family:arial,helvetica,sans-serif"><font><span style="font-family:courier new,monospace" class="hs-comment">{- I&#39;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">-&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">=&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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&#39;s my generic search algorithm written using the typeclasses 

the problem I&#39;m having relates to the fact that I need to call &#39;integrateElem&#39; which is a function in typeclass EvalState, and one of the arguments has the constraint of being of typeclass ElemSet, but I don&#39;t know how to put that constraint in.

The specific error is

&quot;Ambigous type variable &#39;a&#39; in the constraint: &#39;ElemSet a&#39; arising from a use of &#39;integrateElem&#39;&quot;


-}</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">=&gt;</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">-&gt;</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">-&gt;</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">&lt;-</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>