Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala类型不匹配单位而不是Int_Scala_Types - Fatal编程技术网

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

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

完全是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)
我必须承认,我对这个错误消息感到有点困惑,因为我不明白编译器是如何认为我正在尝试传入一个单元类型的,因为给定了逻辑以确保在这一行之前列表不是空的


有人能帮忙澄清一下这个问题吗?

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