I'm not certain but I think this will still fail for exactly the piece that you ignored, which is the crux of the problem.<br><br><div><span class="gmail_quote">On 6/8/06, <b class="gmail_sendername">Greg Buchholz</b> &lt;
<a href="mailto:haskell@sleepingsquirrel.org">haskell@sleepingsquirrel.org</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Christophe Poucet wrote:<br>&gt; The idea however is that MonoType is going to be used in a recursive<br>&gt; way. For instance:<br>&gt;<br>&gt; newtype FMT = FMT MonoType FMT<br>&gt;<br>&gt; instance FMT where...<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;Er, I'll ignore this part.<br>&gt;<br>&gt; And this definition will have to reside on recursive definitions. In the<br>&gt; style of how HasVars was instantiated:<br>&gt;<br>&gt; instance HasVars a =&gt; HasVars (MonoType a) where
<br>&gt; freeVars (TyVar x) = [x]<br>&gt; freeVars (TyConst _ xs) = nub . concatMap freeVars $ xs<br>&gt; occurs x (TyVar y) = x == y<br>&gt; occurs x (TyConst _ xs) = or . map (occurs x) $ xs<br>&gt;<br>&gt; So for Type<br>
&gt;<br>&gt; instance Type a =&gt; Type (MonoType a) where<br>&gt; ...<br>&gt;<br>&gt; That's where it becomes rather troublesome.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Yeah, after a certain point of complexity with type classes, it<br>starts to look like C++ templates.&nbsp;&nbsp;How about something like...
<br><br><br>{-# OPTIONS -fglasgow-exts #-}<br>{-# OPTIONS -fallow-undecidable-instances #-}<br>import List<br><br>type Var = String<br>type Const = String<br><br>data MonoType mt = TyVar Var<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | TyConst Const [mt] deriving (Eq, Show)
<br><br>data PolyType mt = TyPoly [Var] mt deriving (Show)<br><br>class Type a b where<br>&nbsp;&nbsp;&nbsp;&nbsp;toType&nbsp;&nbsp; ::&nbsp;&nbsp; b -&gt; a b<br>&nbsp;&nbsp;&nbsp;&nbsp;fromType :: a b -&gt; b<br>&nbsp;&nbsp;&nbsp;&nbsp;freeVars :: a b -&gt; [Var]<br>&nbsp;&nbsp;&nbsp;&nbsp;occurs&nbsp;&nbsp; :: Var -&gt; a b -&gt; Bool
<br><br>data Nil = Nil<br><br>instance Type MonoType Nil where<br>&nbsp;&nbsp;&nbsp;&nbsp;freeVars (TyVar x) = [x]<br>&nbsp;&nbsp;&nbsp;&nbsp;freeVars (TyConst _ xs) = [&quot;???&quot;]<br><br>instance (Type a b) =&gt; Type MonoType (a b) where<br>&nbsp;&nbsp;&nbsp;&nbsp;freeVars (TyVar x) = [x]
<br>&nbsp;&nbsp;&nbsp;&nbsp;freeVars (TyConst _ xs) = nub . concatMap freeVars $ xs<br>&nbsp;&nbsp;&nbsp;&nbsp;occurs x (TyVar y) = x == y<br>&nbsp;&nbsp;&nbsp;&nbsp;occurs x (TyConst _ xs) = or . map (occurs x) $ xs<br><br>main = print $ freeVars $<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TyConst &quot;foo&quot; [TyConst &quot;bar&quot;&nbsp;&nbsp;[Nil],
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TyConst &quot;baz&quot;&nbsp;&nbsp;[Nil],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TyVar&nbsp;&nbsp; &quot;quux&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br><br>_______________________________________________<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org">
Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br></blockquote></div><br>