为了便于理解,我不能只写一个打印语句:
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
}
作为一个副作用,并且(到目前为止)仅用于正在开发的代码中,是否有更好的临时解决方案?
除了副作用之外,为什么我不应该使用它有什么严重的问题吗?
更新显示真实代码,其中适应一种解决方案比预期更难:
从与 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))
}
}
}
第二部分属于评论,但无法阅读,如果写在那里-也许我最后将其删除。请包涵。
好的 - 这是 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))
}
}
}