使用"列表理解的非正方形列表"在Perl 6中

时间:2015-05-23 15:06:21

标签: list-comprehension perl6

如何使用" list comprehension"创建一个非正方形列表(即平方根不是整数的整数)。在Perl 6?我遇到了显示如何打印非正方形列表的following code from Rosetta Code

sub nth_term (Int $n) { $n + round sqrt $n }

say nth_term $_ for 1 .. 22;

我对列表理解的理解是,它是一种声明方式,类似于set-builder notation,用于描述编程语言中的列表。

到目前为止,我最接近的是使用for关键字。但由于这实际上只是一个内联循环,我认为这在技术上并不是列表理解,即使看起来很相似:

my @y = ($_**2 + 1 for 1 .. 10);

但是,我真正想知道的是,是否有一个"列表理解"创建任何数学上可描述的列表的方法,例如非正方形。这是我如何创建一个非正方形列表(最多30个):

my @non_squares = grep {sqrt($_) != floor(sqrt($_))}, 1 .. 30;

我怎么能这样做列表理解?

1 个答案:

答案 0 :(得分:4)

实际上,my @y = ($_**2 + 1 for 1 .. 10);的示例是编写列表推导的Perl 6方式。您还可以按Perl 6 design document S04

中的建议添加条件测试
  

为了便于编写列表推导,允许循环语句修饰符包含单个条件语句修饰符:
  ...
  @evens = ($_ * 2 if .odd for 0..100);

以下是如何编写非正方形的Perl 6列表理解(最多30个):

my @non_squares = ($_ if .sqrt != .sqrt.Int for 1 .. 30);

一点解释:for循环的每次迭代中,1到30范围内的当前数字被分配给默认变量$_(又名& #34;它&#34)。调用没有调用者的方法调用"它"默认情况下(即.sqrt$_.sqrt相同)。因此,对于1到30范围内的每个数字,检查其平方根以查看它是否具有非整数平方根。如果为true,则它将包含在列表中。