为什么这个Scala行返回一个单位?
下面是一段Scala代码,用于将可被3或5整除的从1到9的值相加。为什么第5行返回的是单位而不是布尔类型为什么这个Scala行返回一个单位?,scala,functional-programming,Scala,Functional Programming,下面是一段Scala代码,用于将可被3或5整除的从1到9的值相加。为什么第5行返回的是单位而不是布尔类型 object Sample { def main(args : Array[String]) { val answer = (1 until 10).foldLeft(0) ((result, current) => { if ((current % 3 == 0) || (current % 5 == 0)) {
object Sample {
def main(args : Array[String]) {
val answer = (1 until 10).foldLeft(0) ((result, current) => {
if ((current % 3 == 0) || (current % 5 == 0)) {
result + current
}
})
println(answer)
}
}
由于没有else子句,if表达式具有Unit类型。因此,有时它不返回任何内容(Unit),因此整个表达式具有Unit类型 (我想你是想问为什么它不返回Int,而不是Boolean)以下是我的解决方案:
scala> val answer = (1 until 10) filter( current => (current % 3 == 0) || (current % 5 == 0)) sum
answer: Int = 23
注意过滤器,而不是if
另一个更为惯用的Scala:
( for( x <- 1 until 10 if x % 3 == 0 || x % 5 == 0 ) yield x ) sum
(对于(x我们能不能太地道了呢?是的,我们能
Set(3,5).map(k => Set(0 until n by k:_*)).flatten.sum
[编辑]
丹尼尔的建议看起来更好:
Set(3,5).flatMap(k => 0 until n by k).sum
与您所做工作最接近的工作代码如下:
object Euler {
def main(args : Array[String]) {
val answer = (1 until 10).foldLeft(0) ((result, current) =>
if ((current % 3 == 0) || (current % 5 == 0))
result + current
else
result
)
println(answer)
}
}
你是对的。我没有意识到实际发生了什么-我对函数式编程非常陌生。处理这个问题的最佳方法是什么?添加一个结果为+0的else?将result+
部分移出if
块(无需重复),并使其成为result+if(…)当前else 0
这不正确。if expr的类型为AnyVal
。错误中的Unit
是else expr中提供的单位值。它知道需要Int
,因为B
类型参数已通过检查第一个参数列表来解决。因为缺少else,所以会混淆插入符号点这是错误消息中的if expr。+1另一个很好的答案。感谢你帮助我学习了一些不同的方法。可能想标记这个项目…对不起,我不是有意破坏。我在发布时没有真正考虑到这一点。我会编辑它,但我不能编辑其他人的答案。只使用平面图,不是更好吗?我事实上,如果您这样做,您甚至可以将其缩短为Set(3,5).flatMap(k=>0,直到n乘以k).sum
.Nice one.Very…err..算术:)