我正在处理一个简单的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”之前a {预计
在同一时刻非法开始陈述
IntelliJ说
类型(String,String,String)的表达式不符合预期类型Float
如果我删除“.asInstanceOf [List [(String,String,String)]]”我得
类型不匹配,预期列表[(字符串,字符串,字符串)],实际:列表[任意]
你对这些问题的原因有什么看法吗?
提前致谢!
答案 0 :(得分:4)
1)将match l
更改为l match
2)将x(1)
更改为x._1
(x
是一个元组,没有列表)
答案 1 :(得分:2)
您正以错误的方式访问元组的字段以及l
左侧的match
blongs。试试这个
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
的一句话:将浮点类型与==
进行比较可能会因缺乏精确度而产生意外结果。