<div dir="ltr"><div style><span style="font-family:arial,sans-serif;font-size:13px">Ah, so is the idea, then, to use <i>op()</i> when `n` wasn&#39;t actually constructed formally, but rather &quot;assembled&quot; by the user, so as to match the type of the accessor function normally supplied as the argument to the constructor?</span></div>
<div style><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div><span style="font-family:arial,sans-serif;font-size:13px">On 6/7/2013 4:51 PM, Tom Ellis wrote:</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; On Fri, Jun 07, 2013 at 04:05:09PM -0400, Joe Q wrote:</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt;&gt; The phantom parameter solves the same problem as scoped type variables.</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt;&gt; Granted, if you find yourself in that kind of polymorphic soup you have</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt;&gt; deeper problems...</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; I don&#39;t understand this.  Scoped type variables are used when you want to</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt; use a type variable from the top level within the body of a function.  If</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; you use &quot;op&quot; and specify a particular constructor then you don&#39;t have a</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt; variable but a concrete instance of a type.  But maybe I&#39;m missing some more</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; powerful way this can be used ...</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">&gt;</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">&gt; Tom</span><br style="font-family:arial,sans-serif;font-size:13px"><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">You can use scoped type variables to correct an ambiguous type error.</span><br style="font-family:arial,sans-serif;font-size:13px">
<br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">You can think of op as a variation on asTypeOf, as documented here on</span><br style="font-family:arial,sans-serif;font-size:13px">
<a href="http://www.haskell.org/haskellwiki/Scoped_type_variables#Avoiding_Scoped_Type_Variables" target="_blank" style="font-family:arial,sans-serif;font-size:13px">http://www.haskell.org/haskellwiki/Scoped_type_variables#Avoiding_Scoped_Type_Variables</a><span style="font-family:arial,sans-serif;font-size:13px">.</span><br style="font-family:arial,sans-serif;font-size:13px">
<br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">If I tried to come up with an example that&#39;s specific to op, it would</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">only be horribly contrived.</span><br style="font-family:arial,sans-serif;font-size:13px"><div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div>
<div><span style="font-family:arial,sans-serif;font-size:13px"><br></span></div></div>