次のコードがあります。
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
から取られています。私が望んでいる(そして期待されている)のは、からの暗黙的な変換が自動的に使用されることです。手動で追加すると機能します:flatten3
ImplicitConversions
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 ソースで暗黙的に宣言されていることはわかっていますが、コンパイラは暗黙的な変換を使用しないのはなぜですか?