考虑到 Perl 6 的类型系统,这个 Perl 有何意义?

How is this Perl sensical, considering Perl 6's type system?

我本来打算把它编辑成 ,但感觉很不一样,我不想每个问题问太多问题。


我的思想...已经爆炸了。

考虑:

use strict;

my Int $n = 6;
my Str $x = "a";
my @l = $n, $x;
say @l ~~ List;

按预期打印 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;

死于:

Type check failed in assignment to @l; expected List but got Int

所以...List 的类型是 List 但我不能它是 List 因为那是一种罪过!

这是怎么回事?这是一个错误吗?还是我把无关紧要的 Python 和 Go 习语带到了 Perl 并破坏了东西?

my List @l = $n, $x;

并不像您认为的那样。它没有声明 @lList。它声明 @l 的元素将是 Lists。您不需要声明 @l 将是一个数组;你在使用印记时已经这样做了。

您可以通过将 List 替换为 Int 来移动爆炸,使 Perl 6 期待 Int 的列表。

my List @l;

是shorthand表示

my @l is Array of List;

对数组的 元素 设置了 List 类型约束。

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

$ 变量的情况类似,因为还涉及一个容器(Scalar),其单个元素具有约束。但是,该约束还允许直接重新绑定到去容器化的值1.


1 如果上面的内容对你来说没有意义,你应该看看赋值 = 和绑定 := 之间的区别。通过 .VAR.WHAT.

检查变量也可能具有指导意义

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

这可以用来颠覆类型系统:

my Int $a;
my $b = 42;
$a := $b;
$b = "not cool";
say $a;

不酷:(