gpt4 book ai didi

scala - 在 scala 中 println for-comprehension

转载 作者:行者123 更新时间:2023-12-03 09:20:16 27 4
gpt4 key购买 nike

在理解中,我不能只放一个打印语句:

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 是错误的,因为结果是一个整数,而不是一个可过滤的整数集合:
  // 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))
}
}
}

最佳答案

这是您需要编写的方式:

scala> 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
| }
prod: (m: Int)scala.collection.immutable.IndexedSeq[Int]

scala> prod(20)
2 3 res159: scala.collection.immutable.IndexedSeq[Int] = Vector(6, 8, 10, 12, 14
, 16, 18, 12, 15, 18)

关于scala - 在 scala 中 println for-comprehension,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com