<div><font color="#3333ff"><font size="4">Hi! How can I specify intermediate type variables to help the compiler do its job?</font></font></div>
<div><font color="#3333ff" size="4"></font> </div>
<div><font color="#3333ff" size="4">The following, simple, code does not compile because the compiler cannot infer that the type variable a&#39; is CInt; this makes sense, because finding that out would be quite hard. How can I tell the compiler that a&#39; is CInt?</font></div>

<div><font color="#3333ff" size="4"></font> </div>
<div> {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances,<br>  UndecidableInstances, FlexibleContexts, EmptyDataDecls, ScopedTypeVariables,<br>  TypeOperators, TypeSynonymInstances #-}</div>
<div>class C a a&#39;  where convert :: a -&gt; a&#39;<br>class F a b   where apply :: a -&gt; b<br>class S s a   where select :: s -&gt; a</div>
<div>data CInt = CInt Int</div>
<div>instance S (Int,String) Int where select (i,_) = i<br>instance C Int CInt where convert = CInt<br>instance F CInt Int where apply (CInt i) = i + 1</div>
<div>f :: forall s a a&#39; b . (S s a, C a a&#39;, F a&#39; b) =&gt; s -&gt; b<br>f s = <br>  let v = select s :: a<br>      v&#39; = convert v :: a&#39;<br>      y = apply v&#39; :: b<br>  in y</div>
<div><br>x :: Int<br>x = f (10,&quot;foo&quot;)</div>
<div> </div>
<div> </div>
<div><font color="#3333ff" size="4">Thanks</font></div>