2016-01-10 17 views
7

ループ内にmapを使用しようとしていますが、このコードは機能しません。このコードは、12を3回印刷する必要があります。しかし、以下のコードは出力を生成しません。 exit行のコメントを外すと、部分的にしか機能しません。どんな考え?私は現在のPerl 6バージョン(Rakudoバージョン2015.12-79-g4bb47d5、MoarVMバージョン2015.12およびWindowsバージョンをベースにしています)を使ってテストしました。Perl 6の "for"ループの中で "map"を使う方法はありますか?

for (1..3) { 
map { say $_ }, (1..2); 
# exit; 
} 

答えて

8

のは

say (map { say $_ }, 1..2).WHAT; 

を見てみましょうこれは怠惰な構造である、Seqを返す&mapを教えてくれる。

また、forループ本体の最後の文はその戻り値を集約するために使用され、CF

my @list = do for 1..3 { 
    map { say $_ }, 1..2; 
} 

say .WHAT for @list; 

あなたは&mapを呼び出した後、別のステートメントを追加した場合、呼び出しはシンク」になりますコンテクスト 'と評価されます。

これはまた、明示的に強制することができます:あなたはまた、 `使用して` eager`の代わりで熱心な配列であると、それを強制することができ

for 1..3 { 
    .say for 1..2; 
} 
+1

for 1..3 { sink map { say $_ }, 1..2; } 

また、ちょうど別のforループを使用シンク '。本当に 'for'は' do '( 'do for 1..3 {...}')の前になければ 'sink'文脈にすべての文を置くべきです –

+5

ここでの教訓は次のようです:ループのように副作用のためのマップのようなフィルタ関数を使用します。 –

関連する問題