Try[Int] 的 Scala 类型错误
Scala type error with Try[Int]
我对不理解的类型有疑问。在下面的代码中,我有两个方法 half1
和 half2
除了明确指定 half1
的 return 类型外,它们完全相同。然而,当我在 foldLeft half
中使用这两种方法时,会导致编译器错误。这是代码。设置val c
的那一行有问题
package org.bodhi.reactive.`try`
import scala.util.{Try, Success, Failure}
object Hello {
def main(args: Array[String]): Unit = {
val list = List(1,2,3)
Try(1024).flatMap(half1)
Try(1024).flatMap(half2)
half1(1024).flatMap(half1)
half2(1024).flatMap(half2)
val a = list.foldLeft(Try(1024))((accum, n) => accum.flatMap(half1))
val b = list.foldLeft(half1(1024))((accum, n) => accum.flatMap(half1))
val c = list.foldLeft(half2(1024))((accum, n) => accum.flatMap(half2)) // Compiler error
}
def half1(n: Int): Try[Int] =
if (n % 2 == 0) Success(n / 2)
else Failure(new Exception(s"WRONG $n"))
def half2(n: Int) =
if (n % 2 == 0) Success(n / 2)
else Failure(new Exception(s"WRONG $n"))
}
我得到的错误是:
[error] /home/chris/projects/reactive/example/src/main/scala/org/bodhi/reactive/try/Hello.scala:18: type mismatch;
[error] found : scala.util.Try[Int]
[error] required: Product with Serializable with scala.util.Try[Int]
[error] val c = list.foldLeft(half2(1024))((accum, n) => accum.flatMap(half2))
我的问题是:为什么half1
comile 在foldLeft 中,而half2
却没有?
我正在使用 scala 2.11.5
Success
和 Failure
都扩展了 Try[T] with Product with Serializable
,(Product with Serializable
因为它们是大小写 类)。因此,当您离开 half2
的 return 类型时,它的 returned 类型被推断为 Try[T] with Product with Serializable
.
通常这无关紧要,flatMap(half2)
仍然会 return Try[T]
scala> Try(1024).flatMap(half2)
res2: scala.util.Try[Int] = Success(512)
但是foldLeft
是另一回事。问题是当您将 half(2)
作为第一个参数传递时。我们看看foldLeft
:
的签名
def foldLeft[B](z: B)(op: (A, B) => B): B
B
是从参数z
推断出来的,也就是说
B = Try[T] with Product with Serializable
这意味着 op
应具有以下类型:
(A, Try[T] with Product with Serializable) => Try[T] with Product with Serializable
但它是 (A, Try[T]) => Try[T]
,因此您会得到类型不匹配。使用类型推断可能很好,但大多数时候显式输入 return 类型会让你省去很多麻烦。
我对不理解的类型有疑问。在下面的代码中,我有两个方法 half1
和 half2
除了明确指定 half1
的 return 类型外,它们完全相同。然而,当我在 foldLeft half
中使用这两种方法时,会导致编译器错误。这是代码。设置val c
的那一行有问题
package org.bodhi.reactive.`try`
import scala.util.{Try, Success, Failure}
object Hello {
def main(args: Array[String]): Unit = {
val list = List(1,2,3)
Try(1024).flatMap(half1)
Try(1024).flatMap(half2)
half1(1024).flatMap(half1)
half2(1024).flatMap(half2)
val a = list.foldLeft(Try(1024))((accum, n) => accum.flatMap(half1))
val b = list.foldLeft(half1(1024))((accum, n) => accum.flatMap(half1))
val c = list.foldLeft(half2(1024))((accum, n) => accum.flatMap(half2)) // Compiler error
}
def half1(n: Int): Try[Int] =
if (n % 2 == 0) Success(n / 2)
else Failure(new Exception(s"WRONG $n"))
def half2(n: Int) =
if (n % 2 == 0) Success(n / 2)
else Failure(new Exception(s"WRONG $n"))
}
我得到的错误是:
[error] /home/chris/projects/reactive/example/src/main/scala/org/bodhi/reactive/try/Hello.scala:18: type mismatch;
[error] found : scala.util.Try[Int]
[error] required: Product with Serializable with scala.util.Try[Int]
[error] val c = list.foldLeft(half2(1024))((accum, n) => accum.flatMap(half2))
我的问题是:为什么half1
comile 在foldLeft 中,而half2
却没有?
我正在使用 scala 2.11.5
Success
和 Failure
都扩展了 Try[T] with Product with Serializable
,(Product with Serializable
因为它们是大小写 类)。因此,当您离开 half2
的 return 类型时,它的 returned 类型被推断为 Try[T] with Product with Serializable
.
通常这无关紧要,flatMap(half2)
仍然会 return Try[T]
scala> Try(1024).flatMap(half2)
res2: scala.util.Try[Int] = Success(512)
但是foldLeft
是另一回事。问题是当您将 half(2)
作为第一个参数传递时。我们看看foldLeft
:
def foldLeft[B](z: B)(op: (A, B) => B): B
B
是从参数z
推断出来的,也就是说
B = Try[T] with Product with Serializable
这意味着 op
应具有以下类型:
(A, Try[T] with Product with Serializable) => Try[T] with Product with Serializable
但它是 (A, Try[T]) => Try[T]
,因此您会得到类型不匹配。使用类型推断可能很好,但大多数时候显式输入 return 类型会让你省去很多麻烦。