2

假设我有以下代码:

object ForComprehension {
  def generateSomeSeq(n: Int): List[Int] = (1 to n).toList
  def square(n: Int): List[Int] =
    for (x <- generateSomeSeq(n)) yield x * x
}

一切正常。但是由于某种原因,我将第一种方法的结果修改SetList

object ForComprehension {
  def generateSomeSeq(n: Int): Set[Int] = (1 to n).toSet
  def square(n: Int): List[Int] =
    for (x <- generateSomeSeq(n)) yield x * x
}

scala 编译器抱怨在第一个生成器中存在类型不匹配的理解。尽管它是有道理的,但我仍然希望它在这两种情况下都有效。毕竟,没有视觉线索可以理解它期望 aList而不是 a Set。我需要阅读两个签名来诊断类型不匹配错误。

或者我不应该期望这样的句法局部性首先用于理解,不是吗?

4

1 回答 1

2

您示例中的 for 理解实际上只是调用的语法糖,map并且返回类型map确实由调用它的类型决定。更准确地说,它是由CanBuildFrom可用的隐式决定的。因此,为了使您的代码编译,您可以将 for 理解转换为 map 调用并显式传递通常隐含的参数:

object ForComprehension {
  def generateSomeSeq(n: Int): Set[Int] = (1 to n).toSet
  def square(n: Int): List[Int] = 
    generateSomeSeq(n).map(x => x * x)(scala.collection.breakOut)
}

关于如何breakOut工作,请参阅这个问题

于 2012-10-24T15:44:45.763 回答