【问题标题】:for-comprehension: type mismatch - required Option[?]理解:类型不匹配 - 必需 Option[?]
【发布时间】:2021-09-17 21:39:47
【问题描述】:

我对在项目中使用 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]?

提前谢谢你!

【问题讨论】:

  • funCallsannotationOption有哪些类型?
  • @Dima funCalls 是 Vector[Call] 类型,并且 annotationOption 返回一个 Option[List[CapabilityArg]] Tim 的回答几乎解决了我的问题,虽然 :)

标签: scala type-mismatch for-comprehension


【解决方案1】:

问题是您在for 中混合了ListOptionfor 的结果集合类型是第一行的集合类型,我假设是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
  ))
}

这将返回Option[List[CapabilityInfo]]

【讨论】:

  • 也许 OP 想要的只是将所有内容扁平化为 List
  • 如果你想把它扁平化成一个List,你可以在funCalls的返回中添加.toList
  • 谢谢@Tim,我从来没有想过在yield之后添加一个块并从那里与ann一起工作。如上所述,funCalls 是 Vector[Call] 类型,并且 annotationOption 返回一个 Option[List[CapabilityArg]]。所以我想做的是从函数调用中的每个调用中获取每个 List[CapabilityArg] 。然后,对于结果列表中的每个 CapabilityArg,我想构造一个 CapabilityInfo。查看我的帖子的编辑:)
【解决方案2】:

感谢@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],然后将其打包到另一个数组中。然后将结果展平,为我提供所需的所有 CapabilityInfos 的一维数组。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多