| aha yeah! good question! We have two different types of type declarations, and each has its own keyword: "structural" and "unique". So you can define two different types as as structural type Optional a = Some a | None
structural type Maybe a = Just a | Nothing and these two types would get the same hash, and the types and constructors could be used interchangeably. If you used the "unique" type instead: unique type Optional a = Some a | None
uniqte type Maybe a = Just a | Nothing Then these would be totally separate types with separate constructors, which I believe corresponds to the `BRANDED` keyword in Modula 3. Originally, if you omitted both and just said: type Optional a = Some a | None The default was "structural". We switched that a couple of years ago so that now the default is "unique". We are interestingly uniquely able to do something like this, since we don't store source code, we store the syntax tree, so it doesn't matter which way you specified it before we made the change, we can just change the language and pretty print your source in the new format the next time you need it. |