J'ai une liste d'ID de chaîne représentant des enregistrements DB. Je voudrais les charger à partir de la base de données de manière asynchrone, puis télécharger chaque enregistrement sur un serveur distant de manière asynchrone, puis, une fois le téléchargement terminé, enregistrer les identifiants des enregistrements téléchargés. Depuis que je suis sur Scala 2.9.2, j'utilise l'implémentation Future de core-util de Twitter, mais elle devrait fonctionner exactement comme les futures 2.10 en termes de transformations Monadic.TraversableOnce, Future et Option dans une Scala pour la compréhension
Le concept général est le suivant:
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
Je suis en train de le faire via une pour la compréhension, mais le fait que le rendement d'un avenir chercher de l'option rend obscure et le code ne compile pas:
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
Compiler cela se traduit par l'erreur suivante:
scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
Qu'est-ce que je mi ssing? pourquoi le compilateur attend-il que uploadedId soit une option? Y at-il une jolie façon de travailler autour de ça?
double possible de [Type Mismatch sur Scala Pour Comprehension] (http://stackoverflow.com/questions/4719592/type-mismatch-on-scala-for-comprehension) –
A Monad est un Monoid dans la catégorie de ** Endo ** - foncteurs. Il suffit de dire ' – folone
@folone: Je crains que tout le monde ne recevra pas la [blague] (http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-category-of -endofunctors-quoi-le-problème). Justin ' –