Since these String-tagged types are disjoint from each other,
there is a compile-time guarantee that a particular tagged-String value can't be misused
as a legimate String of a different tag.
(e.g., an AbbrevIRI String value can't be used as an argument for a function accepting a Pattern String)
OMLString defines multiple tag types on String: - LocalName - LexicalValue - LexicalNumber - LexicalTime - Pattern - LangRange - AbbrevIRI - NamespacePrefix
Since these String-tagged types are disjoint from each other, there is a compile-time guarantee that a particular tagged-String value can't be misused as a legimate String of a different tag. (e.g., an AbbrevIRI String value can't be used as an argument for a function accepting a Pattern String)
https://failex.blogspot.com/2017/04/the-high-cost-of-anyval-subclasses.html
https://code.launchpad.net/~scompall/+junk/high-cost-of-anyval-subclasses