Types 位置参数的类型捕获

Types 位置参数的类型捕获,types,signature,raku,Types,Signature,Raku,即使对于一些简单的东西,类型捕获也是一件很酷的事情: sub assert-same(::T $a, T $b) { ; } assert-same 1, 2; # silent assert-same 1, "a"; # type check error 但是,对于位置,结果是不直观的。如果我有以下签名 sub foo(Str @bar, Str @xyz) { ; } 然后,@bar是一个位置元素,其元素必须是Str,就像@xyz一样。但如果我使用类型捕获,事情会变得很奇怪: s

即使对于一些简单的东西,类型捕获也是一件很酷的事情:

sub assert-same(::T $a, T $b) { ; }

assert-same 1, 2;   # silent 
assert-same 1, "a"; # type check error
但是,对于位置,结果是不直观的。如果我有以下签名

sub foo(Str @bar, Str @xyz) { ; }
然后,
@bar
是一个位置元素,其元素必须是
Str
,就像
@xyz
一样。但如果我使用类型捕获,事情会变得很奇怪:

sub assert-same(::T @a, T @b) { ; }

my Str @x = <i j>;
my Str @y = <x y>;

assert-same @x, @y; 
# Type check failed in binding to parameter '@b';
# expected Positional[Array[Str]] but got Array[Str] (Array[Str].new("x", "y"))

但这似乎有点愚蠢。

我认为这一领域潜伏着许多漏洞。我在几周前发布了这些:

  • )


在发布之前,我搜索了RT和GH rakudo问题队列。在后者中,我提到了“cf#2595和其他bug”。也许它已经在那里了;如果没有,请添加一个问题。TIA。

注意到。它们似乎都是在标量上捕获的,所以这看起来有很大的关联,但有点不同。我会在问题上做更多的研究,如果它真的是不同的,我会写一篇。我现在回想起来,我用位置词偶然发现了这一点,然后发现标量也是错误的,并得出结论,我将发布标量示例。也就是说,您的bug看起来完全不同(预期a[b[c]]得到b[c])。总之,如果你在这些问题中找不到一个基本上完全匹配的问题,但又认为它不足以证明它自己的问题,那么我还是有理由添加一个链接到现有问题之一。
sub assert-same(::T @a, @b where .all ~~ @a.of ) { ; }

my Str @x = <a b c>;
my Str @y = <x y z>;
my Int @i = 1,2,3;
assert-same @x, @y; # silent 
assert-same @x, @i; # type check