Scala类型不匹配单位而不是Int
完全是Scala初学者,现在就开始尝试了解基本知识 作为教程的一部分,我试图创建一个函数,返回整数列表中最大的元素。为了实现这一点,我(暂时)编写了一个包含以下代码的示例:Scala类型不匹配单位而不是Int,scala,types,Scala,Types,完全是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[In
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)
我必须承认,我对这个错误消息感到有点困惑,因为我不明白编译器是如何认为我正在尝试传入一个单元类型的,因为给定了逻辑以确保在这一行之前列表不是空的
有人能帮忙澄清一下这个问题吗?Scala有两种定义函数的结构:
def doSomething(a: Int) { a + 3 }
及
第一种称为过程语法,不鼓励使用,因为它会导致错误的假设和混乱的代码。这两个函数之间的区别在于doSomething
返回Unit
,而doSomethingElse
返回Int
。如果未包含=
,则函数将不会返回任何内容(换句话说,它将返回单元
)
这个
相当于
def doSomething(a: Int): Unit = { a + 3 }
您希望函数findMax
返回一个Int,但由于您没有使用=
,Scala说它返回单位
。这就是导致编译错误的原因。您可以通过以下两种方式解决此问题:
def findMax(a: Int, b: List[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)
}
Scala有两种用于定义函数的结构:
def doSomething(a: Int) { a + 3 }
及
第一种称为过程语法,不鼓励使用,因为它会导致错误的假设和混乱的代码。这两个函数之间的区别在于doSomething
返回Unit
,而doSomethingElse
返回Int
。如果未包含=
,则函数将不会返回任何内容(换句话说,它将返回单元
)
这个
相当于
def doSomething(a: Int): Unit = { a + 3 }
您希望函数findMax
返回一个Int,但由于您没有使用=
,Scala说它返回单位
。这就是导致编译错误的原因。您可以通过以下两种方式解决此问题:
def findMax(a: Int, b: List[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)
}
在-Xfuture下不推荐使用过程语法。我想这就是原因。谢谢你,你澄清了比我意识到的更多让我困惑的事情!如果我可以问一个后续问题,您能解释一下抛出异常时返回的内容吗?具体地说,我最初想把第2行和第3行放在一起,作为guard子句的一部分,而不是if-else条件,但这会导致另一个类型不匹配的实例(Unit而不是Int),然后编译器继续说“xs”在调用findMax函数时没有值。
抛出
是一个非常特殊的情况。它不会回来。也不要尝试不捕获引发的异常类型的s。在这种情况下,的返回类型throws
或try
是一种特殊的底部类型,称为Nothing
。没有Nothing
——甚至null
都不是Nothing
Nothing
是所有事物的子类型,因此在一个分支中返回Nothing
的if
和在另一个分支中返回Int
的if
最终返回Int
,因为这是它两个分支中最常见的类型。如果我理解正确的话,你有一个if
没有其他?这并不是真的错。您的类型错误可能是因为findMax
正在返回Unit
,但是max
应该返回Int
。在-Xfuture下不推荐使用过程语法。我想这就是原因。谢谢你,你澄清了比我意识到的更多让我困惑的事情!如果我可以问一个后续问题,您能解释一下抛出异常时返回的内容吗?具体地说,我最初想把第2行和第3行放在一起,作为guard子句的一部分,而不是if-else条件,但这会导致另一个类型不匹配的实例(Unit而不是Int),然后编译器继续说“xs”在调用findMax函数时没有值。抛出
是一个非常特殊的情况。它不会回来。也不要尝试不捕获引发的异常类型的
s。在这种情况下,的返回类型throws
或try
是一种特殊的底部类型,称为Nothing
。没有Nothing
——甚至null
都不是Nothing
Nothing
是所有事物的子类型,因此在一个分支中返回Nothing
的if
和在另一个分支中返回Int
的if最终返回Int
,因为这是最低的com