为什么这个Scala行返回一个单位?

为什么这个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)) {

下面是一段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)) {
                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..算术:)