Scala: «Выражение не соответствует ожидаемому типу» - PullRequest
0 голосов
/ 17 мая 2018

Я имею дело с простой программой 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)]]», я получу

Несоответствие типов, Ожидаемый список [(String, String, String)], Факт: Список [Любой]

Есть ли у вас какие-либо представления о причине этих проблем?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы неправильно обращаетесь к полям ваших кортежей, а l слева от match.Попробуйте это

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: сравнение типов с плавающей запятой с == может привести к неожиданным результатам из-за недостаточной точности.

0 голосов
/ 17 мая 2018

1) Изменить match l на l match

2) Измените x(1) на x._1 (x - это кортеж, нет списка)

...