Я написал следующую часть кода для разбора типа RDD и Float в выражении. Для разбора арифметических выражений, состоящий поплавка и РДД нравится: «firstRDD + 2»:Как разобрать два разных типа в одном парсере в Scala?
def term2: Parser[List[Either[Float, RDD[(Int,Array[Float])]]]] = rep(factor2)
def factor2: Parser[Either[Float, RDD[(Int,Array[Float])]]] = pathxml | num
def pathxml: Parser[RDD[(Int,Array[Float])]] = pathIdent ^^ {s => pathToRDD(s) } //pathToRDD is a function that gets the path in string and create an RDD from the file inside that path and pathIdent parse to see whether the input string is a path or not
def num: Parser[Float] = floatingPointNumber ^^ (_.toFloat)
Теперь я получаю эту ошибку:
[error] type mismatch;
[error] found : ParseExp.this.Parser[Float]
[error] required: ParseExp.this.Parser[Either[Float,org.apache.spark.rdd.RDD[(Int, Array[Float])]]]
[error] def factor2: Parser[Either[Float, RDD[(Int,Array[Float])]]] = pathxml | num
[error] ^
Я не знаю, как это сделать, за исключением использования " Либо «и не знаю, как решить этот тип несоответствия! Обратите внимание, что если я использую «Любой», он не сможет разобрать RDD.
Что вы используете в классе 'Parser'? Я не могу найти соответствующие документы API. – Reactormonk
Возможно, вы можете использовать тип объединения, определенный в http://milessabin.com/blog/2011/06/09/scala-union-types-curry-howard/. Существует простой рабочий пример на странице https://raw.githubusercontent.com/zalacer/projects-tn/master/UnionTypeDemo/src/tn/UnionTypeDemo.scala. –
@TrisNefzger, это правильный способ сделать это, я согласен. Но Rubbic, похоже, не слишком хорошо знаком с прекрасными сторонами scala, поэтому я не хотел переусердствовать. – Reactormonk