Scala:“表达式不符合预期类型”

Scala:“表达式不符合预期类型”,scala,recursion,types,pattern-matching,Scala,Recursion,Types,Pattern Matching,我正在处理一个简单的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[(Stri

我正在处理一个简单的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
  }
}
但是编译器告诉我:

在匹配之前,应为{

语句在同一点的开始非法

IntelliJ说

类型为String、String、String的表达式不符合预期的类型Float

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

类型不匹配,预期列表[字符串,字符串,字符串],实际:列表[任何]

你知道这些问题的原因吗

提前感谢!

1将比赛l更改为比赛l

2将x1更改为x._1X是一个元组,没有列表


2将x1更改为x._1x是一个元组,没有一个列表

您以错误的方式访问元组的字段,并且l blong位于匹配的左侧。请尝试此操作

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
  }
}

关于getFloatx的一句话。_2==0.0f:由于精度不足,比较浮点类型与==可能会产生意外结果。

您以错误的方式访问元组字段,并且l blong位于匹配的左侧。请尝试此操作

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
  }
}

关于getFloatx的一句话。_2==0.0f:由于精度不足,将浮点类型与==进行比较可能会产生意外结果。

第一个错误总是最重要的。而且可能是第一个错误的结果。正如编译器告诉您的,语法错误。它是l match{case…}而不是l{case…}第一个错误总是最重要的。进一步可能是第一个错误的结果。正如编译器告诉您的,您的语法错了。它是l match{case…}而不是l{case…}谢谢你的回答!我可以用getFloatx检查吗?\u 2==0.0f?谢谢你的回答!我也可以用getFloatx检查吗?@FrancescoSabiu如果这解决了你的问题,请。@FrancescoSabiu如果这解决了你的问题,请。