<br><div class="gmail_quote">On 26 August 2010 08:08, Stephen Tetley <span dir="ltr">&lt;<a href="mailto:stephen.tetley@gmail.com">stephen.tetley@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi Drew<br>
<br>
Bear in mind though that existentials are not equivalent to subtyping in OO.<br>
<br>
For instance, with example 2.1 from [1] all you can do with an Obj is<br>
show it, so for the list xs all you can do is show the elements:<br>
<br>
data Obj = forall a. (Show a) =&gt; Obj a<br>
<br>
xs :: [Obj]<br>
xs = [Obj 1, Obj &quot;foo&quot;, Obj &#39;c&#39;]<br>
<br>
Because Obj is an existential you can&#39;t do an case analysis on it - so<br>
you can&#39;t write a function like this:<br>
<br>
add_one_if_int (Obj (n::Int)) = Obj (n+1)<br>
add_one_if_int (Obj other)    = Obj other<br>
<br>
There really is nothing you can do with Obj other than show it.<br></blockquote><div><br>But that&#39;s because you use Show while defining the Obj data type. You can implement other functionalities, by introducing a custom type class, and implementing functionalities in instance declarations.<br>
<br><span style="font-family: courier new,monospace;">class Show a =&gt; CustomTC a where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    add_one_if_int :: a -&gt; a</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance CustomTC Int where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    add_one_if_int x = x + 1</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance CustomTC Char where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    add_one_if_int = id</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance CustomTC String where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    add_one_if_int = id</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">xs :: [Obj]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">xs = [Obj (1 :: Int), Obj &quot;foo&quot;, Obj &#39;c&#39;]</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">xs&#39; :: [Obj]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">xs&#39; = map (\ (Obj i) -&gt; Obj (add_one_if_int i) ) xs</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">-- xs&#39; = [Obj 2,Obj &quot;foo&quot;,Obj &#39;c&#39;]</span><br style="font-family: courier new,monospace;"><br><br><br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">

If you are trying to transliterate OO designs, you might quickly find<br>
existentials are too inert to be useful.<br>
<br>
Best wishes<br>
<br>
Stephen<br>
<br>
[1] <a href="http://www.haskell.org/haskellwiki/Existential_type" target="_blank">http://www.haskell.org/haskellwiki/Existential_type</a><br>
<div class="im"><br>
<br>
On 26 August 2010 07:45, Drew Haven &lt;<a href="mailto:drew.haven@gmail.com">drew.haven@gmail.com</a>&gt; wrote:<br>
&gt; I think I found the answers to all my questions at<br>
&gt; <a href="http://www.haskell.org/haskellwiki/Existential_type" target="_blank">http://www.haskell.org/haskellwiki/Existential_type</a><br>
</div><div><div></div><div class="h5">_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Ozgur Akgun<br>