Perl 6中使用“列表理解”的非正方形列表

问题描述 投票:2回答:1

如何在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;

如何作为列表理解者?

list-comprehension perl6 raku
1个回答
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范围内的当前数字分配给默认变量$_(也称为“ it”)。默认情况下,没有调用者的方法调用会在“ it”上调用(即.sqrt$_.sqrt相同)。因此,对于介于1到30范围内的每个数字,将检查其平方根以查看其是否具有非整数平方根。如果为true,则它将包含在列表中。
© www.soinside.com 2019 - 2024. All rights reserved.