【问题标题】:Scala,type mismatch; found : (Double, Option[String]) ⇒ Double required: ((Double, Option[String]))Scala,类型不匹配;找到:(Double, Option[String]) ⇒ Double required: ((Double, Option[String]))
【发布时间】:2018-07-16 15:43:51
【问题描述】:

创建匹配案例的代码

       object IrisSepalLengthOption {
       def sepallen(sep_len: Double,species: Option[String]):Double = species 
       match{
       case Some("Iris-setosa") => sep_len * 2
       case Some("Iris-virginica") => sep_len * 3
       case Some("Iris-versicolor") => sep_len * 4
       case _ => 0.0
     }

从 csv 文件中读取数据以解析数据并应用上述功能的主要方法

def main(args: Array[String]){
    println(sepallen(4.0,Some("Iris-setosa"))) // This one works fine


    val source = Source.fromFile("E:\\MI_Dataset\\Iris.csv").getLines().drop(1).toArray
    val sepcol = source.map { line =>
      val str = line.split(",")
      val sep_len = str(1).toDouble
      val speceies = str(5).toString
      (sep_len,Option(speceies))
    }
    sepcol.take(5).foreach(println)  //This one prints the output correctly
    val p = sepcol.map(_._1)
    val s = sepcol.map(_._2)
    val result = sepcol.foreach(sepallen) //Here i am getting the mismatch error
  }

} 

当我调用该函数时,我收到类型不匹配错误,例如(type mismatch; found : (Double, Option[String]) ⇒ Double required: ((Double, Option[String])) ⇒ ?

如何解决这个问题。如果有人澄清这一点,这对我很有帮助

样本数据如下:

  • 1,5.1,3.5,1.4,0.2,鸢尾花
  • 2,4.9,3,1.4,0.2,鸢尾花
  • 3,4.7,3.2,1.3,0.2,鸢尾花
  • 4,4.6,3.1,1.5,0.2,鸢尾花
  • 5,5,3.6,1.4,0.2,鸢尾花
  • 64,6.1,2.9,4.7,1.4,鸢尾花
  • 65,5.6,2.9,3.6,1.3,鸢尾花 66,6.7,3.1,4.4,1.4,鸢尾花 115,5.8,2.8,5.1,2.4,Iris-virginica 116,6.4,3.2,5.3,2.3,Iris-virginica 117,6.5,3,5.5,1.8,Iris-virginica 118,7.7,3.8,6.7,2.2,Iris-virginica

【问题讨论】:

标签: scala


【解决方案1】:

注意预期类型和实际类型之间的细微差别,最重要的是括号:

type mismatch; found : (Double, Option[String]) ⇒ Double required: ((Double, Option[String])) ⇒ ?

sepallen 函数需要两个参数,一个 Double 和一个 Option[String],但语法 sepcol.foreach(func) 需要 func 是单个参数的函数:Tuple(其元素是DoubleOption[String])

您可以通过爆炸元组将其提供给sepallen 来修复它,例如:

val result = sepcol.foreach{ case (sep_len, species) => sepallen(sep_len, species) }

【讨论】:

  • 还有foreach不返回result的问题(至少不是一个有意义的结果)。
  • 我们可以使用 map 代替 foreach。它可以提供所需的输出
  • 确实,但我认为这并不真正在问题的范围内,因为它特别关注给定的异常。 @thanaselvan 如果这有帮助/回答,请不要犹豫,验证答案
  • 是的,这个解决方案真的帮助了我,我是 scala 的新手,答案也会帮助其他人。非常感谢
  • 我的意思是,有一个绿色的复选框,您可以单击它来将您的问题标记为已解决 :-) 这样,社区就知道您不再需要帮助,并且可以更有效地帮助他人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2021-04-21
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多