for-comprehension では、print ステートメントだけを入れることはできません。
def prod (m: Int) = {
for (a <- 2 to m/(2*3);
print (a + " ");
b <- (a+1) to m/a;
c = (a*b)
if (c < m)) yield c
}
しかし、ダミーの割り当てを使用して簡単に回避できます。
def prod (m: Int) = {
for (a <- 2 to m/(2*3);
dummy = print (a + " ");
b <- (a+1) to m/a;
c = (a*b)
if (c < m)) yield c
}
副作用であり、(これまでのところ) 開発中のコードでのみ使用されていますが、より良いアドホック ソリューションはありますか?
副作用以外に、使用すべきではない深刻な問題はありますか?
実際のコードを示す更新。1 つのソリューションを適応させるのは予想よりも困難です。
Rex Kerr との議論から、元のコードを表示する必要性が高まりました。これはもう少し複雑ですが、質問には関係ないように思われました (2x .filter、最後にメソッドを呼び出す)。 Rex のパターンを適用しようとして失敗したので、ここに投稿します。
def prod (p: Array[Boolean], max: Int) = {
for (a <- (2 to max/(2*3)).
filter (p);
dummy = print (a + " ");
b <- (((a+1) to max/a).
filter (p));
if (a*b <= max))
yield (em (a, b, max)) }
ここに私の試みがあります - (b * a).filter は間違っています。結果は int であり、フィルター可能な int のコレクションではないからです:
// wrong:
def prod (p: Array[Boolean], max: Int) = {
(2 to max/(2*3)).filter (p).flatMap { a =>
print (a + " ")
((a+1) to max/a).filter (p). map { b =>
(b * a).filter (_ <= max).map (em (a, b, max))
}
}
}
パート II はコメントに属していますが、そこに書かれている場合は読むことができません。最終的には削除するかもしれません。すみません。
OK - コード レイアウトでの Rex の最後の回答は次のとおりです。
def prod (p: Array[Boolean], max: Int) = {
(2 to max/(2*3)).filter (p).flatMap { a =>
print (a + " ")
((a+1) to max/a).filter (b => p (b)
&& b * a < max).map { b => (m (a, b, max))
}
}
}