完成对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在此行之前不为空。
任何人都可以在这里帮助澄清问题吗?
Scala具有两种用于定义函数的构造:
def doSomething(a: Int) { a + 3 }
和
def doSomethingElse(b: Int) = { b + 3 }
第一个称为过程语法,不建议使用它,因为它会导致错误的假设和令人困惑的代码。这两个函数的区别在于doSomething
return Unit
,而doSomethingElse
return 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] 删除。
我来说两句