6

Float と RDD を含む算術式を解析するための次のパーサーがあります。

 import scalaz._
 import Scalaz._

 def term2: Parser[List[\/[Float, RDD[(Int,Array[Float])]]]] = rep(factor2)
 def factor2: Parser[\/[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, RDD[(Int,Array[Float])]]] = floatingPointNumber ^^ (n => n.left[RDD[(Int,Array[Float])]].toFloat)

次のエラーが発生します。

  [error]  type mismatch;   
  [error]  found   : ParseExp.this.Parser[Serializable]
  [error]  required: ParseExp.this.Parser[scalaz.\/[Float,org.apache.spark.rdd.RDD[(Int, Array[Float])]]]
  [error]   def factor2: Parser[\/[Float, RDD[(Int,Array[Float])]]] = pathxml | num
  [error]                                                                     ^

Scala は初めてで、このエラーを解決する方法がわかりません

4

1 に答える 1

18

Serializable(または同様にProduct、または両方を一緒に) は、ほとんどの場合、2 つの型が同じではないのに同じものとして扱われようとしていることを示しています。例えば:

scala> if (true) "a" else List(1)
res0: java.io.Serializable = a

条件式の型は、その 2 つの分岐の型の上限の最小値です。つまり、分岐に共通する最も具体的な型です。ここに aStringと aList[Int]があり、どちらも のインスタンスですがAnyRef、それ以外は であること以外に共通点はありませんSerializable。両方Serializableであるという事実は、両方とも のサブタイプであるという事実よりも具体的であるAnyRefため、それが推論された型です。

シーケンスの型も同様に推論されます。

scala> List("a", "b", "c", 'd)
res1: List[java.io.Serializable] = List(a, b, c, 'd)

一般に、 が表示されたときはいつでもSerializable、タイプが隣人または兄弟と同じでないものを探し始める必要があります。

あなたの場合、 はとpathxml | numの最小上限になります。これもまたです。を使用して、定義内のより大きな型に持ち上げることで、これを修正できるはずです。Parser[RDDThing]Parser[Float \/ RDDThing]Parser[Serializable]pathxmlfactor2pathxml.map(_.right) | num

于 2015-07-12T21:57:10.727 に答える