<div dir="ltr">Thanks, that really cleared up a few of the questions I had about Jake McArthurs' code as well. The link you provided was a good read and shed some more light on the situation.<div><br></div><div>The only bit I don't quite understand is why the following code implies an "or" relation in the type constraint of repr.</div>

<div><br></div><div><div>> data Stroke =</div><div>>    Line Point Point (forall repr. (CirclePen repr, RectPen repr) => repr)</div><div>>  | Arc Point Point (forall repr. (CirclePen repr) => repr)</div><div>

>  | Spot Point (forall repr.</div><div>>                (CirclePen repr, RectPen repr, ArbitraryPen repr) => repr)</div></div><div><br></div><div>To me this reads that repr should be both a CirclePen and a RectPen in order to satisfy the type constraint in the case of Line, but it seems that it is accepting a CirclePen or a RectPen (which is the desired behaviour, so I'm not complaining). </div>

<div><br></div><div><br></div></div>