-1

次のコードがあります。

import scala.util.parsing.combinator._
import scala.language.implicitConversions

object Parser1 extends RegexParsers with ImplicitConversions with PackratParsers {
  lazy val e: PackratParser[Int] = (
      e ~ "+" ~ e ^^ { (e1, _, e2) => e1 + e2 }
    | e ~ "-" ~ e ^^ { (e1, _, e2) => e1 - e2 }
    | """\d+""".r ^^ { _.toInt }
  )
}

これはコンパイルされません:

error: wrong number of parameters; expected = 1
      e ~ "+" ~ e ^^ { (e1, _, e2) => e1 + e2 }
                                   ^

の定義は、 Scala Style Guideeから取られています。私が望んでいる(そして期待されている)のは、からの暗黙的な変換が自動的に使用されることです。手動で追加すると機能します:flatten3ImplicitConversions

object Parser1 extends RegexParsers with ImplicitConversions with PackratParsers {
  lazy val e: PackratParser[Int] = (
      e ~ "+" ~ e ^^ flatten3({ (e1, _, e2) => e1 + e2 })
    | e ~ "-" ~ e ^^ flatten3({ (e1, _, e2) => e1 - e2 })
    | """\d+""".r ^^ { _.toInt }
  )
}

スコープ内にあり、適切な型を持ち、機能し、Scala ソースで暗黙的に宣言されていることはわかっていますが、コンパイラは暗黙的な変換を使用しないのはなぜですか?

4

1 に答える 1