あるトレイトで、別のトレイトのメソッドから返されたパーサーを使用するのに問題があります。コンパイラは型の不一致について文句を言いますが、問題はパスに依存するクラスが原因であるように見えます。欲しいものをどうやって手に入れるのかわからない。
trait Outerparser extends RegexParsers {
def inner: Innerparser
def quoted[T](something: Parser[T]) = "\"" ~> something <~ "\""
def quotedNumber = quoted(inner.number) // Compile error
def quotedLocalNumber = quoted(number) // Compiles just fine
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
trait Innerparser extends RegexParsers {
def number: Parser[Int] = ("""[1-9][0-9]*"""r) ^^ {str => str.toInt}
}
そしてエラー:
[error] /Path/to/MyParser.scala:6: type mismatch
[error] found : minerals.Innerparser#Parser[Int]
[error] required: Outerparser.this.Parser[?]
[error] def quotedNumber = quoted(inner.number)
それぞれの「何か」メソッドは、パスが囲んでいるクラス(OuterparserまたはInnerparser)に固有のパーサー型を定義しています。Outerparserの「quoted」メソッドは、タイプOuterparser.this.Parserのインスタンスを想定していますが、Innerparser#Parserを取得しています。
このクラスまたは他のクラスから取得したパーサーでquotedを使用できるようにしたいと思います。どうやってやるの?