<p dir="ltr">Great. My aim is to convert a poly-kinded implementation, s, of type-aligned sequences into an implementation of regular sequences by using</p>
<p dir="ltr">newtype AsUnitLoop a (x :: ()) (y :: ()) = UL  a</p>
<p dir="ltr">newtype Lower s a = Lower' (s (AsUnitLoop a) '() '())</p>
<p dir="ltr">Using the postulate, I can "prove" that</p>
<p dir="ltr">s (AsUnitLoop a) x y ~ s (AsUnitLoop a) '() '()</p>
<p dir="ltr">So when I take the tail/init of a sequence I will again get a sequence, and two sequences holding values of the same type can be concatenated. The original reflection-without-remorse code uses</p>
<p dir="ltr">data AsUnitLoop a (x :: *) (y :: *) where<br>
  UL : a -> AsUnitLoop a () ()</p>
<p dir="ltr">which adds an extra constructor to each cell. With the postulate, I get what I want for free. I'm *hoping* it's possible to use a pattern synonym, Lower, that converts</p>
<p dir="ltr">s (AsUnitLoop a) '() '()  (requiring '())</p>
<p dir="ltr">to</p>
<p dir="ltr">Lower s a</p>
<p dir="ltr">but that provides only</p>
<p dir="ltr">exists x y . s (AsUnitLoop a) x y</p>
<p dir="ltr">when matching. This way, the postulate won't "leak" to other code unless it imports a Postulate module. Unfortunately, the pattern synonym documentation is a bit vague on types.</p>
<div class="gmail_quote">On Apr 11, 2016 8:49 PM, "Richard Eisenberg" <<a href="mailto:eir@cis.upenn.edu">eir@cis.upenn.edu</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>I believe this is safe, yes.</div><div><br></div><div>Saying the kind () has infinitely many types in it is somewhat like saying the type () has infinitely many terms in it, like (), undefined, undefined 1, undefined False, ... With the change to type families in the past few years, it should be impossible to match on any inhabitant of the kind () except the type '(). That makes the postulate you postulate quite sensible.</div><div><br></div><div>Richard</div><br><div><div class="elided-text"><div>On Apr 11, 2016, at 4:07 PM, David Feuer <<a href="mailto:david.feuer@gmail.com" target="_blank">david.feuer@gmail.com</a>> wrote:</div><br></div><blockquote type="cite"><div class="elided-text"><p dir="ltr">The () kind has infinitely many inhabitants: the type '() and any stuck or looping types with appropriate kinds. However, I've not been able to find a way to break type safety with the postulate</p><p dir="ltr">unitsEqual :: (a :: ()) :~: (b :: ())</p><p dir="ltr">in GHC 7.10.3 (it was possible using a now-rejected data family in 7.8.3). Is there some way I haven't found yet, or is this safe? If it's *not* safe, is the equivalent postulate using Void instead of () safe? For my purposes, () would be nicer, but it feels riskier.</p></div>
_______________________________________________<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br></blockquote></div><br></div></blockquote></div>