什么类型的Perl 6中的任何类型的列表?

cat*_*cat 4 list perl6

考虑以下Python代码(作为示例):

a = 5 
b = "a"
l = [a, b] # -> typing.List[typing.Any]
print(l)   
# [5, "a"]
Run Code Online (Sandbox Code Playgroud)

列表的类型llist; 它不受它所拥有的类型的约束,因为Python是非常动态的类型.

将此与Go相比较,Go是强结构类型的:

var list []uint8{1, 2, 3, 4, 5, 6}
Run Code Online (Sandbox Code Playgroud)

该列表只能保存最多255个无符号整数.它不能保存任何其他类型.

也去:

var multi interface{"string", []int{9, 5}, rune('5'), []interface{}}
Run Code Online (Sandbox Code Playgroud)

接口允许不同类型的容器.


考虑Perl 6的,这更加动态地在类型比Python say 6 + "1";会给7的整数.(谁认为这是一个我不知道的好主意.)

我喜欢逐渐输入我的程序(特别是对于我正在学习的Perl 6),它提高了可读性和可维护性.

以下工作都不是:

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

也不

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

你得到Type check failed in assignment to @l; expected List but got Int.(其他列表构造语法([vals],<vals>)给出相同的错误).

什么的工作是说的类型Any(或Mu),这是有道理的.(嗯,这对我来说很有意义,因为AnyPython 3.5使用的是相同的关键字.)

use strict;    
my Int $n = 6;
my Str $x = "a";
my Any @l = $n, $x;
Run Code Online (Sandbox Code Playgroud)

但是首先使用Any或者Mu有点击败类型检查的目的.

列表的类型是什么,如果不是List?此外,为什么my List $blah;有效的语法,如果类型检查永远不会传递任何值或其列表?

cuo*_*glm 9

你理解错了,至少列表中Python是从不同的列表中Perl6,它实际上就像在Perl6阵列(和Perl6 名单是像Python 元组).

当你这样做时:

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

您创建一个数组@l强制执行其所有元素必须是类型List.

所以你的第二个例子:

use strict;
my Int $n = 6;
my Int @l = $n, $n;
Run Code Online (Sandbox Code Playgroud)

必须工作.

代码:

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

是相同的:

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

您已允许数组元素为@l任何类型.

  • @cat:如果您阅读此http://doc.perl6.org/language/containers,您会发现它是合理的。 (2认同)
  • @cat 实际上没有。当你说“my Int $x;”时,你并不是说“$x”*是*一个“Int”,而是说“Scalar”“$x”*包含*一个“Int”。这对于数组来说更加明显。 (2认同)

Chr*_*oms 5

如果要对列表的元素进行类型检查,则可以使用绑定:=而不是赋值=

my Int $n =   6;
my Str $x = "a";

# Bind $n and $x to elements of @bound
my @bound := $n, $x;

@bound[1].say;       # Prints "a"
@bound[1] = "Hello"; # Changing the second element changes $x
$x.say;              # Prints "Hello"

@bound[1] = 6; # Dies with error "Type check failed in assignment to $x; expected Str but got Int"
Run Code Online (Sandbox Code Playgroud)

请注意,最后一行创建的错误是指$x,而不是@bound[1]