&gt; You need to tell the compiler explicitly that a and Build r should be the same type.<br /><br />Thanks Daniel :). That was the trick .<br /><br />It&#39;s the first time that I see &quot;~&quot;, is that from -XUndecidableInstances  ? .<br /><br />Also, thanks to Stephen.<br /><br />-<br />Adolfo<br /><br />On Dec 3, 2009 6:30am, Daniel Fischer &lt;daniel.is.fischer@web.de&gt; wrote:<br />&gt; Am Donnerstag 03 Dezember 2009 04:06:43 schrieb Adolfo Builes:<br />&gt; <br />&gt; &gt; &gt; {-# OPTIONS -fglasgow-exts #-}<br />&gt; <br />&gt; &gt; &gt;<br />&gt; <br />&gt; &gt; &gt; module VarArg where<br />&gt; <br />&gt; &gt; &gt; import Data.FiniteMap -- for an example below<br />&gt; <br />&gt; &gt; &gt;<br />&gt; <br />&gt; &gt; &gt; class BuildList a r | r-&gt; a where<br />&gt; <br />&gt; &gt; &gt; build&#39; :: [a] -&gt; a -&gt; r<br />&gt; <br />&gt; &gt; &gt;<br />&gt; <br />&gt; &gt; &gt; instance BuildList a [a] where<br />&gt; <br />&gt; &gt; &gt; build&#39; l x = reverse$ x:l<br />&gt; <br />&gt; &gt; &gt;<br />&gt; <br />&gt; &gt; &gt; instance BuildList a r =&gt; BuildList a (a-&gt;r) where<br />&gt; <br />&gt; &gt; &gt; build&#39; l x y = build&#39;(x:l) y<br />&gt; <br />&gt; &gt; &gt;<br />&gt; <br />&gt; &gt; &gt; --build :: forall r a. (BuildList a r) =&gt; a -&gt; r<br />&gt; <br />&gt; &gt; &gt; build x = build&#39; [] x<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; I&#39;m trying to replace the code below to work with type families, I started<br />&gt; <br />&gt; &gt; out replacing the definition of class with :<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; class BuildList r where<br />&gt; <br />&gt; &gt;     type Build r<br />&gt; <br />&gt; &gt;     build&#39; :: [Build r] -&gt; Build r -&gt; r<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; follow by the instance for [a] resulting in<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; instance BuildList [a] where<br />&gt; <br />&gt; &gt;     type Build [a] = a<br />&gt; <br />&gt; &gt;     build&#39; l x = reverse $ x:l<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; Until here, everything is working, and I&#39;m able to do<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; &gt; build&#39; [2,3,4] 1 :: [Integer]<br />&gt; <br />&gt; &gt; &gt; [4,3,2,1]<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; then I move on to the next instance (a -&gt; r) with<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; instance BuildList r =&gt; BuildList (a-&gt; r) where<br />&gt; <br />&gt; &gt;      type Build (a -&gt; r) =  a<br />&gt; <br />&gt; &gt;      build&#39; l x =  \ y -&gt; build&#39;(x:l) y<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; But I get the following error<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt;     Couldn&#39;t match expected type `Build r&#39; against inferred type `a&#39;<br />&gt; <br />&gt; &gt;       `a&#39; is a rigid type variable bound by<br />&gt; <br />&gt; &gt;           the instance declaration at /home/adolfo/foo.hs:347:35<br />&gt; <br />&gt; &gt;     In the first argument of `(:)&#39;, namely `x&#39;<br />&gt; <br />&gt; &gt;     In the first argument of `build&#39;&#39;, namely `(x : l)&#39;<br />&gt; <br />&gt; &gt;     In the expression: build&#39; (x : l) y<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; then I try with :<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; instance BuildList r =&gt; BuildList (a-&gt; r) where<br />&gt; <br />&gt; &gt;      type Build (a -&gt; r) =  Build r<br />&gt; <br />&gt; &gt;      build&#39; l x =  \ y -&gt; build&#39;(x:l) y<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; And I get<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt;       Couldn&#39;t match expected type `a&#39; against inferred type `Build r&#39;<br />&gt; <br />&gt; &gt;       `a&#39; is a rigid type variable bound by<br />&gt; <br />&gt; &gt;           the instance declaration at /home/adolfo/foo.hs:347:35<br />&gt; <br />&gt; &gt;       Expected type: [Build r]<br />&gt; <br />&gt; &gt;       Inferred type: [Build (a -&gt; r)]<br />&gt; <br />&gt; &gt;     In the second argument of `(:)&#39;, namely `l&#39;<br />&gt; <br />&gt; &gt;     In the first argument of `build&#39;&#39;, namely `(x : l)&#39;<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; I have been trying to figure out, which type should it be, but I haven&#39;t<br />&gt; <br />&gt; &gt; found the correct one, any ideas ?<br />&gt; <br />&gt; <br />&gt; <br />&gt; I think<br />&gt; <br />&gt; <br />&gt; <br />&gt; instance (BuildList r, Build r ~ a) =&gt; BuildList (a -&gt; r) where<br />&gt; <br />&gt;     type Build (a -&gt; r) = a<br />&gt; <br />&gt;     build&#39; l x = \y -&gt; build&#39; (x:l) y<br />&gt; <br />&gt; <br />&gt; <br />&gt; should work.<br />&gt; <br />&gt; <br />&gt; <br />&gt; You need to tell the compiler explicitly that a and Build r should be the same type.<br />&gt; <br />&gt; <br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; Thanks<br />&gt; <br />&gt; &gt;<br />&gt; <br />&gt; &gt; -<br />&gt; <br />&gt; &gt; Adolfo Builes<br />&gt; <br />&gt; <br />&gt;