Foiled by path-dependent types
        Posted  
        
            by 
                Ladlestein
            
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Ladlestein
        
        
        
        Published on 2012-09-19T01:22:11Z
        Indexed on 
            2012/09/19
            3:38 UTC
        
        
        Read the original article
        Hit count: 200
        
I'm having trouble using, in one trait, a Parser returned from a method in another trait. The compiler complains of a type mismatch and it appears to me that the problem is due to the path-dependent class. I'm not sure how to get what I want.
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}
}
And the error:
[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)
I sort-of get the idea: each "something" method is defining a Parser type whose path is specific to the enclosing class (Outerparser or Innerparser). The "quoted" method of Outerparser expects an an instance of type Outerparser.this.Parser but is getting Innerparser#Parser.
I like to be able to use quoted with a parser obtained from this class or some other class. How can I do that?
© Stack Overflow or respective owner