【问题标题】:Scala: "Expression doesn't conform to expected type"Scala:“表达式不符合预期类型”
【发布时间】:2018-10-27 18:04:10
【问题描述】:

我正在处理一个简单的 Scala 程序,其中定义了两个辅助函数:

def getInt(number: String): Int ={
  if(number=="NULL")  0
  else number.toInt
}

def getFloat(number: String): Float ={
  if(number=="NULL") 0
  else number.toFloat
}

还有第三个调用它们的递归函数:

def foldr_rating_state(l: List[(String, String, String)], sum_sat:Int, n_sat:Int, sum_ret:Float, n_ret:Int) :Float = {
  match l{
    case Nil  => ((sum_sat/n_sat)/1600)*(1-(sum_ret/n_ret)).toFloat
    case x::xs    => {
      foldr_rating_state(xs.asInstanceOf[List[(String, String, String)]],
        sum_sat+getInt(x(1)),
        n_sat+(if (getInt(x(1))==0) 0 else getInt(x(1))),
        sum_ret+getFloat(x(2)),
        n_ret+(if (getFloat(x(2))==0.toFloat) 0 else getFloat(x(2))).toInt
      )
      0.toFloat
    }
    case _ => 0.toFloat
  }
}

但是编译器告诉我:

  • 在“匹配 l”之前需要一个 {

  • 语句在同一点非法开始

IntelliJ 说

类型 (String, String, String) 的表达式不符合预期的 Float 类型

如果我删除 ".asInstanceOf[List[(String, String, String)]]" 我会得到

类型不匹配,预期列表[(String, String, String)],实际:List[Any]

您对这些问题的原因有任何想法吗?

提前致谢!

【问题讨论】:

  • 第一个错误总是最重要的。进一步可能是第一个的结果。正如编译器告诉你的那样,你的语法错误。是l match { case ... } 不是match l { case ... }

标签: scala recursion types pattern-matching


【解决方案1】:

1) 将match l 更改为l match

2) 将x(1) 更改为x._1x 是一个元组,不是一个列表)

【讨论】:

【解决方案2】:

您以错误的方式访问元组的字段,l 位于match 的左侧。试试这个

def foldr_rating_state(l: List[(String, String, String)], sum_sat:Int, n_sat:Int, sum_ret:Float, n_ret:Int) :Float = {
  l match {
    case Nil  => 
      ((sum_sat/n_sat)/1600)*(1-(sum_ret/n_ret)).toFloat
    case x :: xs    => {
      foldr_rating_state(
        xs,
        sum_sat+getInt(x._1),
        n_sat+(if (getInt(x._1)==0) 0 else getInt(x._1)),
        sum_ret+getFloat(x._2),
        n_ret+(if (getFloat(x._2)==0.0f) 0 else getFloat(x._2).toInt
      )
    }
    case _ => 0.0f
  }
}

关于getFloat(x._2)==0.0f 的一句话:将浮点类型与== 进行比较可能会由于精度不足而产生意想不到的结果。

【讨论】:

  • 感谢您的回答!那么我可以通过 getFloat(x._2)==0.0f 来检查吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2019-02-12
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多