2014-10-17 3 views
0

Я пишу приложение Play 2.3.2 в Scala.Ошибка при возврате Будущее [Boolean] из a for для Scala

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

Пример документа, как следующее:

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

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

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

Для этого я пишу метод, который выполняет итерацию по элементам 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 для повторения двух раз в списке.

ответ

1

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

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

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

+0

Хорошо, я решил использовать карту, спасибо. –