Sort of? If you say ~[]~ and 'pizza are in this context "types" that hold single elements, then you could argue that this is "unioning types". (quasiforms match the antiform, quoteds match one quote level dropped...so you can quote a quasi to match a quasi literally)
With FENCE! I think we'll have enough parts to make &(integer) a fundamental type, which will free up &[...] for using TYPE-BLOCK! to declare "union types"... you have this ability to go outside the WORD! space if you want to:
any-topping!: &['pepperoni 'onions 'olives 'tomatoes '<no-sauce>]
Then maybe &{...} could be "intersection types". &{even? integer!}
I was thinking numbers might mean length of. &{3 block!}
This is a cleaner version of what was originally proposed for the MATCH dialect. Maybe it's the TYPECHECK dialect (or simply, CHECK ?), and MATCH should be taken for DESTRUCTURE.
>> check [integer! tag!] 3
== 3
>> check [integer! tag!] "hello"
== ~null~ ; anti
>> check [~null~ integer!] null
** Error: use CHECK/META for testing keyword states
>> check/meta [~null~ integer!] null
== ~null~
>> check/meta [~null~ integer!] "hello"
== ~null~ ; anti
>> non integer! "hello"
== "hello"
>> non integer! 3
== ~null~ ; anti
>> ensure integer! 3
== 3
>> ensure integer! "hello"
** Error: "hello" is not &(integer)
>> prohibit integer! "hello"
== "hello"
>> prohibit integer! 3
== Error: 3 is &(integer)
Overall, what this is going to permit with dialected chains looks very promising, e.g. typechecking [{block! all:word?}].