Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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 为什么在使用Left WITH parameters类型时出现不明确的引用错误?_Scala_For Comprehension - Fatal编程技术网

Scala 为什么在使用Left WITH parameters类型时出现不明确的引用错误?

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 <

在练习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 <- 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 field
v1时没有为我问题的第二个示例生成任何错误,因为它现在能够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)