First, There Was Quote "Protection"...
An operating premise has been that this would be bad:
>> (type of first [''a]) = (type of first [''''(x y z)]) == #[true]
You've got a double-quoted word going in on the left, and a quadruply-quoted group going in on the right. They're both instances of QUOTED! but is it in any way useful to say they're the same type?
Of course, we do this with BLOCK! and don't blink:
>> (type of [[a]]) = (type of [[[[(x y z)]]]]) == #[true]
We only look at the outermost container.
But following precedent from where LIT-PATH! and LIT-WORD! were seen as different types, the concept of folding not just quotedness but the actual quoting level into the type arose.
At first, Ren-C did a fairly cheap thing, by quoting the answer of TYPE OF by the number of quotes:
>> type of first [a] == #[datatype! word!] >> type of first [''a] == ''#[datatype! word!]
But that won't be recognized as a DATATYPE!, because it's a QUOTED!
This matters if you try something like:
>> quoted-word!: first [''#[datatype! word!]] >> did parse [''a] [quoted-word!] == #[false] >> did parse ['#[datatype! word!]] [quoted-word!] == #[true]
The problem here is that PARSE already has an idea of how it handles QUOTED!s, e.g. to match something that is one quoting level lower than that thing. So this quoted datatype isn't acting how you intended.
So I Suggested Arrays To Wrap Quoted Types
When the idea of using &[...] arrays to represent types came along, I suggested this could be a solution:
>> type of first [a] == &[word] >> type of first [''a] == &[''word]
This gives us the nice properties we want of making these distinct "types" for purposes of comparison, while still both being of the same fundamental type for purposes of dispatch.
Might Type Arrays Have Other Parameters?
We could ask if all of these type arrays are just one element long--where that element is always a WORD!, quoted WORD!, or quasi WORD!...
Or might they have other parameters in them? Would a vector say what they were vectors of:
>> type of vec == &[vector int32]
Would a matrix have its dimensions?
>> type of mat == &[matrix (32 32)]
I've suggested that the narrower question of KIND might come back with a simpler answer:
>> kind of mat == &matrix