gpt4 book ai didi

scala - 为什么这个用于使用元组的表达式的 Scala 无法编译?

转载 作者:行者123 更新时间:2023-12-04 10:30:12 25 4
gpt4 key购买 nike

使用 Scala 2.8.1,编译这个:

val t = (40, 2)

println(for ((i, j) <- List(t)) yield i + j)

val e: Either[String, (Int, Int)] = Right(t)
println(e.right.map {
case (i, j) => i + j
})
println(for ((i, j) <- e.right) yield i + j)

给出了这个:
test.scala:9: error: constructor cannot be instantiated to expected type;
found : (T1, T2)
required: Either[Nothing,(Int, Int)]
println(for ((i, j) <- e.right) yield i + j)

根据 Scala 编程,for 表达式应该等同于 map/case 表达式,但只有后者才能编译。我做错了什么,我该怎么做?

最佳答案

实际上,这并不是正在发生的翻译。您可以引用this answer以获得更完整的指南,但即使在那里也没有明确提及这种情况。

发生的情况是使用模式匹配的 for comprehension 过滤了不匹配的情况。例如,

for((i, j) <- List((1, 2), 3)) yield (i, j)

将返回 List((1, 2)): List[(Any, Any)] , 如 withFilter首先被调用。现在, Either好像没有 withFilter ,所以它将使用 filter ,这是理解的实际翻译:
e.right.filter { case (i, j) => true; case _ => false }.map { case (i, j) => i + j }

这给出了完全相同的错误。问题是 e.right返回 RightProjection ,但是 filterRightProjection[A, B]返回 Option[Either[Nothing, B]] .

原因是没有“空”这样的东西 Either (或 RightProjection ),因此需要将其结果封装在 Option 上.

话虽如此,但从理解层面来看,确实令人惊讶。我认为正确的做法是 filter改为返回某种过滤投影。

关于scala - 为什么这个用于使用元组的表达式的 Scala 无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831453/

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