结 ~~ 结行为

Junction ~~ Junction behavior

我想检查一个数组的所有元素是否都给定了类型。

$ raku -e 'my @t = 1,2,3; say all(@t) ~~ Int'
True

$ raku -e 'my @t = 1,2,3,"a"; say all(@t) ~~ Int'
False

到目前为止工作正常。现在我想允许两种类型:

$ raku -e 'my @t = 1,2,3,"a"; say all(@t) ~~ Int|Str'
False

为什么会这样?如果 1 ~~ Int|Str 对于单个元素是 True 为什么它对于 all() 元素连接失败?

顺便说一句:这个问题是关于理解 Junction ~~ Junction 行为(这也有点未记录),而不是关于从示例中执行检查的替代方法(我知道这是可能的)。

一些额外的行可能有助于阐明正在发生的事情:

say all(1,    2,   3)  ~~ Int|Str; # OUTPUT: «True»
say all('a', 'b', 'c') ~~ Int|Str; # OUTPUT: «True»
say all(1,    2,  'c') ~~ Int|Str; # OUTPUT: «False»

也就是说,all(1, 2, 'c') ~~ Int|Str 是在问“是否所有 1, 2, 'c' 都是 Int,或者,是否所有 1, 2, 'c' ] 是 Str 吗?”由于两者都不是这种情况,因此 returns False.