I've been doing this in some code for years:

type s = [`A | `B]
type t = [s]

but just discovered it works only because the code was passing through camlp4. Without camlp4, it fails. You can try in utop with and without doing #camlp4o.

Is there some way to get the above to work without camlp4? AFAICT, the grammar allows it, so the normal parser is wrong here.