<div dir="auto">Forwarded from Andrew Martin below. I think we want more than just Maybe (more than one null), but the nesting I described is certainly more convenience than necessity.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Andrew Martin</strong> <span dir="auto"><<a href="mailto:andrew.thaddeus@gmail.com">andrew.thaddeus@gmail.com</a>></span><br>Date: Wed, Oct 14, 2020, 4:14 PM<br>Subject: Re: Restricted sums in BoxedRep<br>To: David Feuer <<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>><br></div><br><br><div dir="ltr"><div>You'll have to forward this to the ghc-devs list to share it with others since I'm not currently subscribed to it, but I've had this same thought before. It is discussed at <a href="https://github.com/andrewthad/impure-containers/issues/12" target="_blank" rel="noreferrer">https://github.com/andrewthad/impure-containers/issues/12</a>. Here's the relevant excerpt:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><p>Relatedly, I was thinking the other day that after finishing implementing <a href="https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0203-pointer-rep.rst" target="_blank" rel="noreferrer">https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0203-pointer-rep.rst</a>, I should really look at seeing if it's possible to add this maybe-of-a-lifted value trick straight to GHC. I think that with:</p>
<pre><code>data RuntimpRep
  = BoxedRep Levity
  | MaybeBoxedRep Levity
  | IntRep
  | ...

data BuiltinMaybe :: forall (v :: Levity). TYPE v -> TYPE ('MaybeBoxedRep v)
</code></pre>
<p>This doesn't have the nesting issues because the kind system prevents
 nesting. But anyway, back to the original question. I would recommend 
not using <code>Maybe.Unsafe</code> and using <code>unpacked-maybe</code>
 instead. The latter is definitely safe, and it only costs an extra 
machine word of space in each data constructor it gets used in, and it 
doesn't introduce more indirections.</p></div></blockquote></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 13, 2020 at 5:47 PM David Feuer <<a href="mailto:david.feuer@gmail.com" target="_blank" rel="noreferrer">david.feuer@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">Null pointers are widely known to be a lousy language feature in general, but there are certain situations where they're *really* useful for compact representation. For example, we define<div dir="auto"><br></div><div dir="auto">    newtype TMVar a = TMVar (TVar (Maybe a))</div><div dir="auto"><br></div><div dir="auto">We don't, however, actually use the fact that (Maybe a) is lifted. So we could represent this much more efficiently using something like</div><div dir="auto"><br></div><div dir="auto"><span style="font-family:sans-serif">    newtype TMVar a = TMVar (TVar a)</span><br></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><span style="font-family:sans-serif">where Nothing is represented by a distinguished "null" pointer.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div dir="auto"><font face="sans-serif">While it's possible to implement this sort of thing in user code (with lots of fuss and care), it's not very nice at all. What I'd really like to be able to do is represent certain kinds of sums like this natively.</font></div><div dir="auto"><font face="sans-serif"><br></font></div><div dir="auto"><font face="sans-serif">Now that we're getting BoxedRep, I think we can probably make it happen. The trick is to add a special Levity constructor representing sums of particular shapes. Specifically, we can represent a type like this if it is a possibly-nested sum which, when flattened into a single sum, consists of some number of nullary tuples and at most one Lifted or Unlifted type.  Then we can have (inline) primops to convert between the BoxedRep and the sum-of-sums representations.</font></div><div dir="auto"><font face="sans-serif"><br></font></div><div dir="auto"><font face="sans-serif">Anyone have thoughts on details for what the Levity constructor arguments might look like?</font></div></div>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr">-Andrew Thaddeus Martin</div>
</div>