Почему я получаю "тип шаблона несовместим с ожидаемым типом"? - PullRequest
4 голосов
/ 16 июня 2010

Я столкнулся с ошибкой в ​​своем коде Scala, которую не могу решить самостоятельно (я новичок в Scala). У меня есть следующий код:

def myFunction(list: List[Any]): String = {
  var strItems : String = "";
  list.foreach(item => {
    strItems += item match {
      case x:JsonSerializable => x.toJson()
      case y:String => ("\"" + y + "\"")
      case _ => item.toString
    }
    if(item != list.last)
      strItems +=  ",";
  })
  strItems;
}

Я получаю ошибку:

ошибка: тип шаблона несовместим с ожидаемым типом; Найдено: Строка требуется: Единица case y: String => ("\" "+ y +" \ "")

Есть идеи, почему?

PS: есть ли более эффективный способ кодирования myFunction

Ответы [ 2 ]

7 голосов
/ 16 июня 2010

С точки зрения исходного вопроса, код не компилируется, потому что он требует скобок вокруг совпадения, т.е. strItems += (item match { ... })

Более "функциональный" способ написания этого может быть следующим:

def myFunction(list:List[Any]):String = {
  val strings:List[String] = list.map{
    case x:JsonSerializable => x.toJson()
    case y:String => ("\"" + y + "\"")
    case z => z.toString
  }
  strings.mkString(",")
}

Вы, вероятно, могли бы использовать представление, чтобы сделать его ленивым и более "производительным", хотя я не знаю, насколько это возможно, объединит два нижележащих цикла (map & mkString) в одиночный обход.

0 голосов
/ 16 июня 2010

Вот форма вашего кода, которая компилируется (без любого определения для JsonSerializable) (в Scala 2.8) вместе с более краткой формулировкой (которая также оказывается бессмысленной):

object Javier01 {
  def
  javFunc(list: List[Any]): String = {
    val strItems = new StringBuilder()

    list.foreach { item =>
      strItems.append ( item match {
//      case x: JsonSerializable => x.toJson()
        case y: String => "\"" + y + "\""
        case _ => item.toString
      } )

      if (item != list.last)
        strItems.append(",")
    }
    strItems.toString
  }

  def
  rrsFunc(anys: List[Any]): String =
    anys map {
//    case x: JsonSerializable => x.toJson()
      case s: String => "\"" + s + "\""
      case x => x.toString
    } mkString ","


  def
  main(args: Array[String]): Unit = {
    val stuff = List(true, 1, 123.456, "boo!")

    printf("        stuff : %s%njavFunc(stuff): %s%nrrsFunc(stuff): %s%n%n",
           stuff, javFunc(stuff), rrsFunc(stuff))
  }
}

Выход от запуска это:

% scala Javier01
        stuff : List(true, 1, 123.456, boo!)
javFunc(stuff): true,1,123.456,"boo!"
rrsFunc(stuff): true,1,123.456,"boo!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...