On May 1, 2019, at 5:32 AM, Remi Forax <fo...@univ-mlv.fr> wrote: > > If there is only one constant of type Empty and the construction is typesafe, > it can be a huge win.
If Empty is an inline (value) type with no components, then Empty.default is the singleton, and there's nothing else to say about it. This is a use case for empty inlines. In fact they are unit types, as recognized in many languages. (There are some low-level technical reasons why Valhalla doesn't support this now, but they can be overcome with a bit of work. One problem is how to keep track of a field of size zero, if you are using relative offsets at present.) — John P.S. Either a sum of N zero-length unit types or a classic enum of N elements, could be represented as a byte of lgN bits. (Or lg(N+1) if it's nullable.) We can't do this in the old contract of L-types, but under the new contract that allows early loading of field types, we could pull such tricks for either enums or unit-sums, in the JVM. So if Foo is a small enum, LFoo; requires 8 or 4 bytes, but GFoo; (where G is the "go and look" contract) can require just 1 byte, just like a boolean.