考虑到Perl 6的类型系统,这个Perl如何变得敏感?

cat*_*cat 11 types perl6 raku

我本来会把它编辑成我的其他相关问题,但感觉不一样,我不想在每个问题上问太多问题.


我的思绪......爆炸了.

考虑:

use strict;

my Int $n = 6;
my Str $x = "a";
my @l = $n, $x;
say @l ~~ List;
Run Code Online (Sandbox Code Playgroud)

True正如预期的那样打印.

那么考虑一下:

use strict;

my Int $n = 6;
my Str $x = "a";
my List @l = $n, $x; # <-- only change is the type notation
say @l ~~ List;
Run Code Online (Sandbox Code Playgroud)

哪个死了:

Type check failed in assignment to @l; expected List but got Int
Run Code Online (Sandbox Code Playgroud)

所以...列表的类型是列表,但我不能说它是列表,因为这是一个罪!

这里发生了什么?这是一个错误吗?或者我将我不相关的Python和Go成语带到Perl并破坏事物?

dar*_*rch 12

my List @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)

不会做你认为它做的事情.它没有声明那@l是一个List.它宣称@l将是Lists 的元素.你不需要声明@l它将是一个数组; 当你使用这个印记时,你已经这样做了.

您可以通过替换来移动爆炸List,Int以使Perl 6期望Ints 列表.


Chr*_*oph 10

my List @l;
Run Code Online (Sandbox Code Playgroud)

是简写符号

my @l is Array of List;
Run Code Online (Sandbox Code Playgroud)

它对数组List元素设置了类型约束.

容器上的类型约束已经通过@sigil 表示,对应于角色Positional,而%sigil对应于角色Associative.

的情况下,$变量是只要类似也有涉及(的容器Scalar,其单个元件上的约束).但是,约束也允许直接重新绑定到去包含的值1.


1如果上述内容对您没有意义,您应该研究赋值=和绑定之间的区别:=.检查变量via也可能是有益的.VAR.WHAT.

请注意,只要其元素在绑定时满足类型约束,我们也可以重新绑定到另一个标量容器.

这可以用来破坏类型系统:

my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;
Run Code Online (Sandbox Code Playgroud)

不酷:(