gpt4 book ai didi

Try[Int] 的 Scala 类型错误

转载 作者:行者123 更新时间:2023-12-04 14:27:03 24 4
gpt4 key购买 nike

我对我不理解的类型有疑问。在下面的代码中,我有两种方法 half1half2除了 half1 之外,它们完全相同的返回类型是明确指定的。然而,当我在 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在 foldLeft 中,但是 half2才不是?
我正在使用 Scala 2.11.5

最佳答案

两者 SuccessFailure延长 Try[T] with Product with Serializable , ( Product with Serializable 因为它们是案例类)。所以当你离开 half2 的返回类型时,它的返回类型推断为 Try[T] with Product with Serializable .

通常这无关紧要,flatMap(half2)仍会返回 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] ,因此您会遇到类型不匹配。使用类型推断可能很好,但大多数情况下,明确输入返回类型会为您省去很多麻烦。

关于Try[Int] 的 Scala 类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com