Scala:“表达式不符合预期类型”
我正在处理一个简单的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
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如果这解决了你的问题,请。