Ошибка при возврате Future[Boolean] из for в Scala

Я пишу приложение Play 2.3.2 на Scala.

Я использую reactivemongo в качестве драйвера для моей базы данных MongoDB. У меня есть коллекция под названием «recommendation.tagsSimilarity», которая содержит значение сходства между моими тегами, где тег имеет форму: «категория: атрибут».

Пример документа выглядит следующим образом:

{
    "_id" : ObjectId("5440ec6e4165e71ac4b53a71"),
    "id" : "10912199495810912197116116114-10912199581091219711611611450",
    "tag1" : "10912199495810912197116116114",
    "tag1Name" : "myc1:myattr",
    "tag2" : "10912199581091219711611611450",
    "tag2Name" : "myc:myattr2",
    "eq" : 0
}

Домент представляет собой элемент матрицы размеров nxn, где n — количество сохраненных тегов.

Теперь я создал коллекцию под названием «recommendation.correlation», в которой я сохраняю корреляцию между «категорией» и тегом.

Для этого я пишу метод, который перебирает элементы TagSimilarity как матрицу.

def calculateCorrelation: Future[Boolean] = {
    def calculate(category: String, tag: String): Future[(Double, Double)] = {//calculate the correlation and return the tuple value
    }

    play.Logger.debug("Start Correlation")
  Similarity.all.toList flatMap { tagsMatch =>
    for(i <- tagsMatch) {
      val category = i.tag1Name.split(":")(0) // get the tag category
      for(j <- tagsMatch) {
        val productName = j.tag2Name //obtain the product tag
        calculate(category, productName) flatMap {value =>
          val correlation = Correlation(category, productName, value._1, value._2) //create the correlation object
          val query = Json.obj("category" -> category, "attribute" -> productName)
          Correlations.update(query, correlation, upsert = true) flatMap{status => status match {
            case LastError(ok, _, _, _, _, _, _) => Future{true}
            case _ => Future{false}
          }}
        }
      }
    }


  }

}

Но компилятор выдает мне следующую ошибку:

[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/algorithms/Pearson.scala:313: type mismatch;
[error]  found   : Unit
[error]  required: scala.concurrent.Future[Boolean]
[error]     for(i <- tagsMatch) {
[error]           ^
[error] /Users/alberto/git/bdrim/modules/recommendation-system/app/recommendationsystem/algorithms/Pearson.scala:313: type mismatch;
[error]  found   : Unit
[error]  required: scala.concurrent.Future[Boolean]
[error]     for(i <- tagsMatch) {
[error]           ^
[error] one error found

Что не так?? Я не могу понять, почему оператор for ничего не возвращает. В дополнение я хочу спросить, почему я не могу написать код для понимания в Scala для повторения двух раз в списке.


person alberto adami    schedule 17.10.2014    source источник


Ответы (1)


Вы забыли использовать yield с for:

for(i <- tagsMatch) { ... } преобразуется в инструкцию foreach.

Используя for(i <- tagsMatch) yield { ... }, он фактически преобразуется в карту/flatMap и дает результат (не забудьте использовать его на обоих ваших for).

person Justin Kaeser    schedule 17.10.2014