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
中混合了 List
和 Option
。 afor
的结果集合类型是第一行的集合类型,我假设是Option
。 for
中的最后一行将生成多个值,但 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 结构?!
我对在项目中使用 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
中混合了 List
和 Option
。 afor
的结果集合类型是第一行的集合类型,我假设是Option
。 for
中的最后一行将生成多个值,但 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 结构?!