While finalizing my upcoming Raku Advent Calendar post on sigils, I decided to double-check my understanding of the type constraints that sigils create. The docs describe sigil type constraints with the table below:

Based on this table (and my general understanding of how sigils and containers work), I strongly expected this code
my %percent-sigil is List = 1,2;
my @at-sigil is Map = :k<v>;
to throw an error.
Specifically, I expected that is List
would attempt to bind the %
-sigiled variable to a List
, and that this would throw an X::TypeCheck::Binding
error – the same error that my %h := 1,2
throws.
But it didn't error. The first line created a List
that seemed perfectly ordinary in every way, other than the sigil on its variable. And the second created a seemingly normal Map
. Neither of them secretly had Scalar
intermediaries, at least as far as I could tell with VAR
and similar introspection.
I took a very quick look at the World.nqp source code, and it seems at least plausible that discarding the %
type constraint with is List
is intended behavior.
So, is this behavior correct/intended? If so, why? And how does that fit in with the type constraints and other guarantees that sigils typically provide?
(I have to admit, seeing an %
-sigiled variable that doesn't support Associative indexing kind of shocked me…)