В целях понимания я не могу просто написать заявление для печати:
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
}
Являясь побочным эффектом и использовавшимся (пока) только в разрабатываемом коде, есть ли лучшее специальное решение?
Есть ли серьезная проблема, почему я не должен использовать это, помимо побочного эффекта?
обновление, показывающее реальный код, где адаптация одного решения сложнее, чем ожидалось:
Из разговора с Рексом Керром возникла необходимость показать оригинальный код, который немного сложнее, но, похоже, не имеет отношения к вопросу (2x .filter, вызывающий метод в конце), но когда я попытался применить к нему шаблон Рекса, у меня ничего не вышло, поэтому я публикую его здесь:
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 относится к комментариям, но не может быть прочитана, если там написано - может быть, я удалю ее в конце. Пожалуйста, извините.
Хорошо - вот последний ответ Рекса в макете кода:
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))
}
}
}