println在scala for-comprehension
发布时间:2020-12-16 09:43:06 所属栏目:安全 来源:网络整理
导读:在一个理解中,我不能只是一个打印声明: 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 = p
在一个理解中,我不能只是一个打印声明:
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,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,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,15,18) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |