Ho una lista di identificativi di stringa che rappresentano i record DB. Mi piacerebbe caricarli dal DB in modo asincrono, quindi caricare ogni record su un server remoto in modo asincrono, quindi quando tutti hanno finito di caricare, registra gli id dei record che sono stati caricati.TraversableOnce, Future e Option in a Scala per comprensione
Dal momento che sono su Scala 2.9.2, sto utilizzando l'implementazione Future di nucleo-util di Twitter, ma dovrebbe funzionare esattamente come i futuri 2.10 in termini di trasformazioni monadiche.
Il concetto generale è questo:
def fetch(id: String): Future[Option[Record]]
def upload(record: Record): Future[String]
def notifyUploaded(ids: Seq[String]): Unit
val ids: Seq[String] = ....
che sto cercando di fare questo attraverso una per la comprensione ma il fatto che recuperare restituisce un futuro di opzione rende oscuro e il codice non viene compilato:
for {
id <- ids
maybeRecord <- fetch(id)
record <- maybeRecord
uploadedId <- upload(record)
} yield uploadedId
compilazione il risultato è il seguente errore:
scala: type mismatch;
found : com.twitter.util.Future[String]
required: Option[?]
uploadedId <- upload(record)
^
Cosa sto mI ssing? perché il compilatore si aspetta che uploadId sia un'opzione? c'è un modo carino per aggirare questo?
possibile duplicato del [tipo non corrispondente a Scala per la comprensione] (http://stackoverflow.com/questions/4719592/type-mismatch-on-scala-for-comprehension) –
una monade è un Monoide nel categoria di ** Endo ** - funtori. Basta dire ' – folone
@folone: temo che non tutti avranno il [scherzo] (http://stackoverflow.com/questions/3870088/a-monad-is-just-a-monoid-in-the-category-of -endofunctors-cosa-il-problema). Appena dico ' –