代码之家  ›  专栏  ›  技术社区  ›  Gábor Bakos

为了理解元组,withfilter不是成员错误

  •  0
  • Gábor Bakos  · 技术社区  · 6 年前

    以下代码段

    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 回复  |  直到 6 年前
        1
  •  1
  •   Gábor Bakos    6 年前

    避免打电话给 withFilter 并且保持当前的语法,如果编译器插件用于以不同的方式处理理解,则会有所帮助。选项正在使用 better-monadic-for .

    将此添加到build.sbt文件应使问题中的代码编译:

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

    (尽管它也有其他的-通常是积极的-影响,请查看它的文档。)

        2
  •  0
  •   Gábor Bakos    6 年前

    代码中似乎没有过滤,但实际上scala中的模式匹配用于理解(之前 <- )被翻译为 withFilter . TailCalls 不支持 带滤波器 ,因此无法编译。不过,以下重写将编译:

    import util.control.TailCalls._
    done((3, '3')).map{ case (num, ch) => num}
    
        3
  •  0
  •   Gábor Bakos    6 年前

    另一个选择是 withFilter 使用扩展方法,例如这样(并将其包含在使用站点的作用域中):

      implicit class TailCallsExtension[A](t: TailRec[A]) {
        def withFilter(pred: A => Boolean): TailRec[A] = t.flatMap(a => if (pred(a)) t else done(a))
      }