在for循环中,我不能仅仅放置一个打印语句:
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))
}
}
}
prod(20)
调用它。 - user unknown((a+1) to max/a).filter(b => p(b) && b*a < max).map{ b => em(a,b,max) }
就可以解决问题。此外,第一个 map 应该是 flatMap。 - Rex Kerrfilter (b => p(b))
是正确的方式。将过滤器与&& b*a < max
结合也很清楚。然后重复b =>
是我如果再搜索 4 个小时也不会找到的东西,我想明天也不会,在这里看一下才行。 - user unknownx =>
而不是b =>
。这只是需要一个名称的东西;在经过过滤器后它恰好是相同的东西,所以我使用了同一个变量。 - Rex Kerr