On Monday, 4 January 2021 at 22:55:28 UTC, Ola Fosheim Grøstad
wrote:
"BarInt", "Bar!int" and "Foo!int" are all names, or labels, if
you wish. And they all refer to the same object: the nominal
type. Which you can test easily by using "is(BarInt==Foo!int)".
If the terminology is difficult, let' call them "signifiers". If
D add type-functions, then another signifier for the same type
could be "Combine(Foo,int)".
It should not matter which signifier you use, if they all yield
the exact same object (in the mathematical sense): the same
nominal type "struct _ {}", then they should be interchangeable
with no semantic impact.
This is a very basic concept in PL design. If you name the same
thing several ways (any way you like), then the effect should be
the same if you swap one for another. It should be
indistiguishable.