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

时间:2016-01-25 16:39:36

标签: types perl6 raku

我要把它编辑成my other related question,但感觉不一样,我不想在每个问题上问太多问题。

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

考虑:

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

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

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

2 个答案:

答案 0 :(得分:12)

my List @l = $n, $x;

不符合您的想法。它并未声明@lList。它声明@l的元素将是List。您不需要声明@l将是一个数组;当你使用这个印记时,你已经这样做了。

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

答案 1 :(得分:10)

my List @l;

的简写符号
my @l is Array of List;

在数组的元素上放置List类型约束。

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

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

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

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

这可用于破坏类型系统:

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

不酷:(