Hi everyone,<br><br>I believe I have come to the conclusion that what I would like to do is impossible, but I would like to have that confirmed. I would basically like to be able to have a heterogeneous list without boxing everything in a data type. Below is the sample code, with the code I would like to use commented out. I&#39;m I missing something, or does Haskell simply not support what I am trying for?<br>
<br><span style="font-family: courier new,monospace;">{-# LANGUAGE ExistentialQuantification #-}</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">data Foo = Foo String</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">class IFoo a where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; toFoo :: a -&gt; Foo</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">instance IFoo Foo where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; toFoo = id</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">data A = A String</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance IFoo A where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; toFoo (A a) = Foo a</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">data B = B Int</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">instance IFoo B where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; toFoo (B b) = Foo $ show b</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">data FooBox = forall t. IFoo t =&gt; FooBox t</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance IFoo FooBox where</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; toFoo (FooBox f) = toFoo f</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">myPrint :: IFoo t =&gt; [(String, t)] -&gt; IO ()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">myPrint = mapM_ myPrint&#39;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">myPrint&#39; :: IFoo t =&gt; (String, t) -&gt; IO ()</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">myPrint&#39; (key, value) =</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; let (Foo foo) = toFoo value</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp; in putStrLn $ key ++ &quot;: &quot; ++ foo</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">{- What I&#39;d like to do:</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">main = myPrint</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; [ (&quot;one&quot;, Foo &quot;1&quot;)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; , (&quot;two&quot;, A &quot;2&quot;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ]</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-}</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">main = myPrint</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; [ (&quot;one&quot;, FooBox $ Foo &quot;1&quot;)</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; , (&quot;two&quot;, FooBox $ A &quot;2&quot;)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; ]</span><br><br>----<br><br>Thanks<br style="font-family: courier new,monospace;"><br>