Play2とreactivemongoを使用して、mongodbで利用可能なスラッグを見つけようとしています。次の再帰的な方法を思いつきました。
private def findSlug(base: String, index: Int): String = {
val slug: String = Slug({
base + "-" + index
})
for {
user <- findOne(BSONDocument("slug" -> slug))
} yield {
user match {
case None => slug
case Some(user) => findSlug(base, index+1)
}
}
}
次のエラーが表示されます
found : scala.concurrent.Future[String]
required: String
user <- findOne(BSONDocument("slug" -> slug))
^
戻り値の型を変更したり、yield の結果をマッピングしたりするなど、いろいろ試しましたが、もっと単純で簡潔で正しい解決策があるのではないかと思います。要するに、別の非同期関数を呼び出す再帰関数があるということです。
findSlug の戻り値の型を Future[String] に変更すると、
[error] found : scala.concurrent.Future[String]
[error] required: String
[error] case Some(user) => findSlug(base, index+1)
[error] ^
正しい慣用的な解決策は何でしょうか?