realizing a lot of datatypes are often confused with something else because of their lexical form
example 1: http. the uri *looks* like a string, and the uri rfc will tell you it has path/query/fragment components, but in http it is more accurately a tuple of (host, resource) and there is no special consideration for path vs query. you just request /path?query as a single string which is the resource name or identifier.
example 2: semver. again, it is a tuple of (major, minor, patch, variant).