Scala 为什么在使用Left WITH parameters类型时出现不明确的引用错误?
在练习scala面试问题时,我发现“对超负荷定义的模糊引用” 我试图找到以下导致编译错误的代码块的结果: 代码:Scala 为什么在使用Left WITH parameters类型时出现不明确的引用错误?,scala,for-comprehension,Scala,For Comprehension,在练习scala面试问题时,我发现“对超负荷定义的模糊引用” 我试图找到以下导致编译错误的代码块的结果: 代码: for { v1 <- Left[Int,Int](1) v2 <- Right(2) v3 <- Right(3) v4 <- Left(4) } yield v1 + v2 + v3 + v4 我又尝试了一个版本,但也出现了错误: for { v1 <- Left(1) v2 <- Right(2) v3 <
for {
v1 <- Left[Int,Int](1)
v2 <- Right(2)
v3 <- Right(3)
v4 <- Left(4)
} yield v1 + v2 + v3 + v4
我又尝试了一个版本,但也出现了错误:
for {
v1 <- Left(1)
v2 <- Right(2)
v3 <- Right(3)
v4 <- Left(4)
} yield v1 + v2 + v3 + v4
用于{
v1这是因为没有常见的推断类型,而且您也没有为所有的指定类型
所以
scala>for(v1这是因为没有常见的推断类型,而且您也没有为所有的指定类型
所以
scala>for(v1)您正在为
编写一个,因此编译器需要同时跟踪左类型和右类型。您的示例既没有提供这些类型,也没有提供足够的信息让编译器正确推断它们。例如v4@Luis Miguel Mejía Suárez,很好地解释了这个问题。但是为什么scala compile会这样做呢在我的示例中,我只为v1字段指定了类型?不确定您的意思?第一种情况下,不会生成任何错误。第一个版本确实会生成错误。您正在为
编写一个,因此编译器需要跟踪左类型和右类型。您的示例既没有提供这些类型,也没有提供足够的信息例如v4@Luis Miguel Mejía Suárez,很好地解释了这个问题。但是为什么scala compile在我的示例中的第一个情况下没有生成任何错误,我只为v1字段指定了类型?不确定你的意思是什么?第一个版本确实会生成错误。为什么scala com当我尝试为字段v1使用String
type时,piler没有为我问题中的第二个示例生成任何错误,因为它现在可以推断类型为或[any,Int]
,使其成为一种常见类型。但就结果而言,这仍然是可疑的,因为当您将收益率更改为yield v1
或yield v2
时,它们都返回Left(1)
。我认为这是本身Left[Int,Int](1)
也可以写成Left(1)。withRight[Int]
好的,我阅读了文档,这很好地解释了“要么是右偏的,这意味着假设右是操作的默认情况。如果是左偏的,则像map、flatMap等操作会返回左值不变”@kanielc@Luis Miguel Mejía Suárez:感谢您提供了大量信息的讨论。您能用最后一条评论中的结论更新答案吗?这样我就可以接受答案了。为什么scala编译器在我尝试使用String
type for fieldv1时没有为我问题的第二个示例生成任何错误,因为它现在能够o将类型推断为或者[Any,Int]
,使其成为一种常见类型。但就结果而言,这仍然是可疑的,因为当您将收益率更改为收益率v1
或者收益率v2
时,它们都返回左(1)
。我认为这是或者本身左[Int,Int](1)的问题
也可以写成Left(1)。使用right[Int]
好的,我阅读了文档,这很好地解释了“要么是右偏的,这意味着假设右是操作的默认情况。如果是左,像map、flatMap等操作返回的左值不变”@kanielc@Luis Miguel Mejía Suárez:感谢您提供了大量信息的讨论。请您用最后一条评论中的结论更新答案。这样我就可以接受答案了。
for {
v1 <- Left[String,Int]("1")
v2 <- Right(2)
v3 <- Right(3)
v4 <- Left[Int, Int](4)
} yield v1 + v2 + v3 + v4
res20: scala.util.Either[Any,Int] = Left(1)
for {
v1 <- Left(1)
v2 <- Right(2)
v3 <- Right(3)
v4 <- Left(4)
} yield v1 + v2 + v3 + v4
<console>:17: error: value + is not a member of Nothing
} yield v1 + v2 + v3 + v4
scala> for (v1 <- Right(2)) yield v1
res13: scala.util.Either[Nothing,Int] = Right(2)