gpt4 book ai didi

raku - Perl 6 在键入数组时报告 "Cannot unbox a type object"

转载 作者:行者123 更新时间:2023-12-03 16:53:50 25 4
gpt4 key购买 nike

我怀疑这可能是 Rakudo 中的一个错误,但我今天才开始使用 Perl 6,所以很有可能我只是犯了一个错误。在这个简单的程序中,在 sub 中声明一个类型化数组似乎会让 Perl 6 编译器生气。删除数组上的类型注释可以消除编译器错误。

这是一个简单的素数查找程序:

#!/usr/bin/env perl6
use v6;

sub primes(int $max) {
my int @vals = ^$max; # forcing a type on vals causes compiler error (bug?)
for 2..floor(sqrt($max)) -> $i {
next if not @vals[$i];
@vals[2*$i, 3*$i ... $max-1] = 0;
}
return ($_ if .Bool for @vals)[1..*];
}

say primes(1000);

在 Rakudo Star 2016.07.1(来自 Fedora 24 存储库)上,该程序给出以下错误:
[sultan@localhost p6test]$ perl6 primes.p6 
Cannot unbox a type object
in sub primes at primes.p6 line 8
in block <unit> at primes.p6 line 13

如果我删除 vals 数组上的类型注释,则程序可以正常工作:
    ...
my @vals = ^$max; # I removed the int type
...

我在使用 Perl 6 时是否犯了错误,或者这是 Rakudo 中的错误?

最佳答案

类型检查发现了代码中的潜在错误
您收到的错误消息引起了对第 8 行的注意:

@vals[2*$i, 3*$i ... $max-1] = 0;
此行分配 = 右侧的值列表到左边的元素列表。
左侧列表中的第一个元素, @vals[2*$i] ,得到一个零。
您没有在右侧定义更多值,因此左侧的其余元素被分配了 Mu . Mu s 可以很好地用作没有特定类型且没有特定值的元素的占位符。想想 Mu就像 Null 一样,除了它是类型安全的。
你会得到与这个打高尔夫球的版本相同的场景:
my @vals;
@vals[0,1] = 0; # assigns 0 to @vals[0], Mu to @vals[1]

如您所见,当您没有为 @vals 的元素指定显式类型约束时,一切正常。大批。
这是因为数组元素的默认类型约束是 Mu .所以分配一个 Mu对一个元素很好。

如果您觉得它收紧了您的代码,您可以显式分配零:
@vals[2*$i, 3*$i ... $max-1] = 0 xx Inf;
这会在 RHS 上生成一个(惰性)无限的零列表,以便将零分配给 LHS 上的每个元素列表。
即使您为 @vals 指定了类型约束,只需进行此更改,您的代码也将正常工作。 .

如果不介绍 xx Inf但请为 @vals 指定元素类型约束那不是 Mu ,那么如果您尝试分配 Mu,您的代码将无法通过类型检查到 @vals 的元素.
根据您使用的是对象类型还是 native 类型,类型检查失败将出现以下两种情况之一。
如果您指定对象类型约束(例如 Int ):
my Int @vals;
@vals[0,1] = 0;
然后你会得到一个类似这样的错误:
Type check failed in assignment to @vals; expected Int but got Mu (Mu)
如果你指定一个原生类型约束(例如 int 而不是 Int ):
my int @vals;
@vals[0,1] = 0;
然后编译器在尝试类型检查之前首先尝试从对象值生成合适的 native 值(这称为“拆箱”)。但是没有合适的原生值对应于对象值( Mu )。所以编译器提示它甚至不能拆箱这个值。最后,正如开头所暗示的那样,而 Mu作为类型安全的 Null 非常有效,这只是 Mu 的一个方面.另一个是 "type object" .所以错误信息是 Cannot unbox a type object .

关于raku - Perl 6 在键入数组时报告 "Cannot unbox a type object",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39027398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com