gpt4 book ai didi

scala - 当编译器找到Serializable而不是match类型时,如何解决类型不匹配的问题?

转载 作者:行者123 更新时间:2023-12-04 16:39:02 24 4
gpt4 key购买 nike

我有以下解析器来解析包含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的新手,不知道如何解决此错误

最佳答案

Serializable(或类似的Product,或两者都在一起)几乎总是表明您在尝试将两种不同的类型视为相同。例如:

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

条件表达式的类型是其两个分支的类型中最小的上限-即分支机构最共同的类型。在这里,我们有一个 StringList[Int],它们都是 AnyRef的实例,但是除了是 Serializable之外,没有其他共同之处。它们都是 Serializable的事实比它们都是 AnyRef的子类型的事实更为具体,所以这就是推断的类型。

序列类型的推导类似:
scala> List("a", "b", "c", 'd)
res1: List[java.io.Serializable] = List(a, b, c, 'd)

通常,只要您看到 Serializable,就应该开始寻找类型与其邻居或 sibling 不同的东西。

在您的情况下, pathxml | num将是 Parser[RDDThing]Parser[Float \/ RDDThing]的最小上限,后者又是 Parser[Serializable]。您应该能够通过使用 pathxmlfactor2提升为 pathxml.map(_.right) | num定义中的较大类型来解决此问题。

关于scala - 当编译器找到Serializable而不是match类型时,如何解决类型不匹配的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com