对于元组的理解,withFilter不是成员错误

时间:2018-12-09 16:31:33

标签: scala

以下代码段

import util.control.TailCalls._
for {(num, ch) <- done((3, '3'))
} yield num

无法编译并显示错误消息:

  

value withFilter不是util.control.TailCalls.TailRec [(Int,Char)]

的成员

我正在使用Scala 2.12.7。如何避免这个错误? (带有Scala插件v2018.3.4的IntelliJ Idea 18.3.1没有显示错误。)

3 个答案:

答案 0 :(得分:1)

为避免调用withFilter并保持当前语法,如果使用编译器插件来不同地处理理解,则将很有帮助。一个选项正在使用better-monadic-for

将此内容添加到build.sbt文件中后,即可编译问题中的代码:

addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.0-M4")

(尽管它也具有其他通常具有积极作用的效果,请查阅其文档。)

答案 1 :(得分:0)

看似在代码中没有过滤,但是实际上Scala中用于理解的模式匹配(在<-之前)被转换为对withFilter的调用。 TailCalls不支持withFilter,因此无法编译。但是,以下重写会编译:

import util.control.TailCalls._
done((3, '3')).map{ case (num, ch) => num}

答案 2 :(得分:0)

另一种选择是使用扩展方法实现timespanbutton3 ,例如这样(并在使用站点的范围内):

withFilter