Scala类型不匹配单位,而不是Int

瑞安·B

完成对Scala的初学者学习,并立即尝试确定基础知识。

作为教程的一部分,我试图创建一个函数,该函数返回整数列表中的最大元素。为此,我(暂定)编写了以下代码:

def max(xs: List[Int]): Int =
  if (xs.isEmpty)
    throw new java.util.NoSuchElementException
  else
    findMax(xs.head, xs.tail)

def findMax(a: Int, b: List[Int]) {
  if (b.isEmpty) return a

  if (a > b.head)
    findMax(a, b.tail)
  else
    findMax(b.head, b.tail)
}

但是,当我尝试编译它时,第5行出现类型错误。

[error]  /scala/example/src/main/scala/example/Lists.scala:5: type mismatch;
[error]  found   : Unit
[error]  required: Int
[error]         findMax(xs.head, xs.tail)

我必须承认我对这个错误消息有些困惑,因为我不明白编译器如何认为我正在尝试传递一个Unit类型,因为要确保逻辑,以确保List在此行之前不为空。

任何人都可以在这里帮助澄清问题吗?

Zeimyth

Scala具有两种用于定义函数的构造:

def doSomething(a: Int) { a + 3 }

def doSomethingElse(b: Int) = { b + 3 }

第一个称为过程语法,不建议使用它,因为它会导致错误的假设和令人困惑的代码。这两个函数的区别在于doSomethingreturn Unit,而doSomethingElsereturn Int如果不包含=,则函数将不返回任何内容(换句话说,它返回Unit)。

def doSomething(a: Int) { a + 3 }

相当于

def doSomething(a: Int): Unit = { a + 3 }

您希望您的函数findMax返回一个Int,但是由于您没有使用=In,Scala说它返回了Unit这是您的编译错误的原因。您可以通过以下任何一种方式解决此问题:

def findMax(a: Int, b: List[Int]) = {

或者

def findMax(a: Int, b: List[Int]): Int = {

通常,永远不要使用过程语法。始终使用=,即使您最终将最终返回类型留给类型推断。


应该注意的是,第一种方法实际上可能会导致编译器错误,因为您return在函数中使用了该方法。显式调用的函数return需要在函数头中指定它们返回的类型。因为Scala是一种基于表达式的语言,所以每个语句都是一个表达式,因此返回一个值。您可以将findMax函数重写为不需要return,如下所示:

def findMax(a: Int, b: List[Int]): Int = {
  if (b.isEmpty)
    a
  else if (a > b.head)
    findMax(a, b.tail)
  else
    findMax(b.head, b.tail)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章