【发布时间】: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