for-comprehension: type mismatch - 必需选项[?]

for-comprehension: type mismatch - required Option[?]

我对在项目中使用 Scala 比较陌生,偶然发现了一个我不明白的问题。

这是我的代码。为了清楚起见,我注释了类型:

val fcs = for {
      fc: Call <- funCalls
      ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments, fc)
      arg: CapabilityArg <- ann
} yield CapabilityInfo(
      "CapabilityArgument", arg.id.name, new LSPRange, new LSPRange
)

哪些错误:

type mismatch;
 found   : List[LSPServer.this.CapabilityInfo]
 required: Option[?]

如果删除 for-comprehension 中的最后一行,错误就会消失。那条线不应该没问题吗,因为我只映射了一个 List[CapabilityArg]?

提前致谢!

问题是您在 for 中混合了 ListOption。 afor的结果集合类型是第一行的集合类型,我假设是Optionfor 中的最后一行将生成多个值,但 Option 只能包含一个值。

这可能是您想要的:

val fcs = for {
  fc: Call <- funCalls
  ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments, fc)
} yield {
  ann.map(arg => CapabilityInfo(
    "CapabilityArgument", arg.id.name, new LSPRange, new LSPRange
  ))
}

这将 return Option[List[CapabilityInfo]]

感谢@Tim 我想到了这个解决方案:

val fcs = for {
      fc: Call <- funCalls : Array[Call]
      ann: List[CapabilityArg] <- context.annotationOption(Annotations.CapabilityArguments, fc) : Option[List[CapabilityArg]]
} yield {
      ann.toArray.map(arg =>
        CapabilityInfo("CapabilityArgument", arg.id.name, new LSPRange, new LSPRange)
      )
}

return fcs.flatten

我将 funCalls 切换为 Array[Call] 类型,因此我生成了一个 Array[CapabilityInfo],然后将其打包到另一个数组中。然后将结果展平以提供所需的所有 CapabilityInfo 的一维数组。

事后看来,我可能应该采用常规的嵌套 for-each 结构?!