2

Perl 6 で「リスト内包表記」を使用して、非平方 (つまり、平方根が整数ではない整数) のリストを作成するにはどうすればよいですか? 非正方形のリストを印刷する方法を示す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;

リスト内包表記としてこれを行うにはどうすればよいですか?

4

1 に答える 1

4

実際、あなたの例my @y = ($_**2 + 1 for 1 .. 10);は、リスト内包表記を書くPerl 6の方法です。Perl 6 設計ドキュメント S04で提案されているように、条件付きテストを追加することもできます。

リスト内包表記を書きやすくするために、ループ ステートメント修飾子には、単一の条件付きステートメント修飾子を含めることができます

@evens = ($_ * 2 if .odd for 0..100);

非正方形 (最大 30) の Perl 6 リスト内包表記を作成する方法は次のとおりです。

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

簡単な説明:ループの各反復で、for1 から 30 までの範囲の現在の数値がデフォルト変数$_(別名「it」) に割り当てられます。invocant のないメソッド呼び出しは、デフォルトで "it" で呼び出されます (つまり.sqrt、 と同じです$_.sqrt)。したがって、1 から 30 の範囲の各数値について、その平方根が整数でない平方根を持つかどうかがチェックされます。true の場合、リストに含まれます。

于 2015-05-23T15:06:20.783 に答える