<div dir="ltr">> On
<i style="color:rgb(0,0,0);font-family:"Times New Roman";font-size:medium">Tue Sep 1 21:18:40 UTC 2020, </i><i style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"> Richard Eisenberg wrote:</i><div><i style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></i></div><div><i style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">> </i><span style="color:rgb(0,0,0);font-family:monospace,monospace;font-size:1em;white-space:pre-wrap">I see the core idea as a fairly straightforward generalization of the "Partial Type Constructors" work </span></div><div><span style="color:rgb(0,0,0);font-family:monospace,monospace;font-size:1em;white-space:pre-wrap"><br></span></div><div><pre style="white-space:pre-wrap;color:rgb(0,0,0)">Ah. Now I see a bit more of what you're getting at. We want as if the type synonym were an associated type family with a most-general instance</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"> class Num a => CPoint a where</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"> type Point a</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"> instance Num a => CPoint a where</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"> type Point a = (a, a)</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">The semantics to be as the PTC paper, such that expanding `Point a` always requires a `CPoint a` instance, which will in turn want a `Num a`.</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">And the expansion to be immediate (as with type synonyms) so that the client can put `Point a` in instance heads, for example.</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">> But I really don't know what it means to expand without adding parens. ... what about</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">> <i style="font-size:1em">pointX :: Point a -> a</i></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><i style="font-size:1em">> ... </i>We don't want that type to expand to (Num a => (a, a)) -> a</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">Ok, it was your using fancy type operators that put me off. We can represent the AST (and show the need for parens) by reverting to prefix syntax, within H98:</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"> pointX :: (->) (Point a) a -- needs parens around (Point a)</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">And yes my naieve syntactic expansion would give the type you show, wot we do not want.</pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)">AntC</pre></div></div>