To me, the issue is: how does Perl 6 actually carry out the type inference we're doing here?
And I believe it's an important question to get right, as we may eventually see Perl 6 doing more type inference...either in core, or else through some nefarious module that some evil genius eventually writes. ;-) If Perl 6 does type inference on some $value simply by calling $value.WHAT, then: multi foo(0|1) {...} should indeed be equivalent to: multi foo(Junction $ where 0|1) {...} However, that's not the only possibility (nor, in my opinion, the most predictable or useful). If, for example, Perl 6 did type inference by calling an internal: multi infer-type (Any $value) { $value.WHAT } then: multi foo(0|1) {...} would be equivalent to: multi foo(Int|Int $ where 0|1) {...} which is, of course, just: multi foo(Int $ where 0|1) {...} which, in my view, would be a much more useful outcome in the vast majority of cases. I accept that it's important to be able to explicitly declare a parameter as a Junction, so it's immune to junctive autothreading, but I don't think that should be the norm...and certainly shouldn't happen implicitly. That's why variables, parameters, and return values that are not explicitly typed default to Any, rather than to Junction. And, I think this is another implicit case where a non-junctive outcome would be more useful...and more widely expected. In other words, for the one time in a thousand (or fewer) where I actually want: sub foo(Junction $ where 0|1) {...} then I should have to be explicit about that argument being junctive (because I should *always* have to be explicit about an argument being junctive). And for the 999 times I want: sub foo(Any $ where 0|1) {...} I should be able to just write: sub foo(0|1) {...} Damian