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

时间:2018-05-17 12:52:29

标签: 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[(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)]]”我得

  

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

你对这些问题的原因有什么看法吗?

提前致谢!

2 个答案:

答案 0 :(得分:4)

1)将match l更改为l match

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

答案 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的一句话:将浮点类型与==进行比较可能会因缺乏精确度而产生意外结果。