【问题标题】:Why does this Scala line return a Unit?为什么这条 Scala 行返回一个 Unit?
【发布时间】:2010-10-28 00:13:18
【问题描述】:

这里有一段 Scala 代码,用于将可被 3 或 5 整除的 1 到 9 的值相加。为什么第 5 行返回的是 Unit 而不是 Boolean 类型?

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)
    }

}

【问题讨论】:

  • 可能想标记这个项目-euler-spoiler ...
  • 对不起,我不是故意的。发帖的时候还真没想到。我会编辑它,但我无法编辑其他人的答案。

标签: scala functional-programming


【解决方案1】:

if 表达式具有 Unit 类型,因为没有 else 子句。因此有时它不返回任何内容 (Unit),因此整个表达式的类型为 Unit。

(我假设您的意思是问为什么它没有返回 Int,而不是 Boolean)

【讨论】:

  • 你是对的。我没有意识到实际发生了什么——我对函数式编程真的很陌生。处理这个问题的最佳方法是什么?添加一个结果 + 0 的 else?
  • result +部分移出if块(无需重复),并使其成为result + if (...) current else 0
  • 这是不正确的。 if expr 的类型为AnyVal。错误中的Unit 是else expr 中提供的单位值。它知道Int 是必需的,因为B 类型参数已经通过检查第一个arg 列表来解决。因为 else 不存在,令人困惑的是插入符号指向错误消息中的 if expr。
【解决方案2】:

我们可以惯用吗?是的,我们可以!

Set(3,5).map(k => Set(0 until n by k:_*)).flatten.sum

[编辑]

Daniel 的建议看起来更好:

Set(3,5).flatMap(k => 0 until n by k).sum

【讨论】:

  • 使用flatMap不是更好吗?
  • 其实如果你这样做,你甚至可以把它缩短为Set(3,5).flatMap(k => 0 until n by k).sum
  • 不错的一个。非常...错误..算术:)
【解决方案3】:

这是我的解决方案:

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

【讨论】:

  • +1 另一个很好的答案。感谢您帮助我学习几种不同的方式。
【解决方案4】:

与您所做的最接近的工作代码是这样的:

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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2012-10-27
    • 2022-12-03
    相关资源
    最近更新 更多