TraversableOnce, Future und Option in einer Scala zum Verständnis

8

Ich habe eine Liste von String-IDs, die DB-Datensätze darstellen. Ich möchte sie asynchron aus der Datenbank laden, dann jeden Datensatz asynchron auf einen Remote-Server hochladen und nach dem Hochladen die IDs der hochgeladenen Datensätze notieren.

Da ich auf Scala 2.9.2 bin, benutze ich Twitter's Core-util Future-Implementierung, aber es sollte genau wie die 2.10-Futures in Bezug auf monadische Transformationen funktionieren.

Das allgemeine Konzept ist das:

%Vor%

Ich versuche dies über ein Verständnis zu tun, aber die Tatsache, dass Abruf eine Zukunft der Option zurückbringt, macht es undurchsichtig und der Code kompiliert nicht:

%Vor%

Das Kompilieren führt zu dem folgenden Fehler:

%Vor%

Was vermisse ich? Warum erwartet der Compiler uploadedId als Option? Gibt es irgendeine schöne Art, wie ich das umgehen könnte?

    
Electric Monk 01.03.2013, 09:18
quelle

2 Antworten

6

Betrachten Sie die Signatur der Funktion flatMap (oder bind):

%Vor%

In Ihrem Fall versuchen Sie, flatMap für Option zu verwenden, indem Sie f angeben, das ein Future generiert. Aber wie in der obigen Signatur sollte f etwas in derselben Monade erzeugen, in der es aufgerufen wurde.

Scala ist in dieser Hinsicht nicht unbedingt sehr hilfreich, da es ziemlich gut darin ist, Dinge umzuwandeln (zum Beispiel in Seq s), so dass Sie den Eindruck haben, dass Sie beliebige flatMap -Anrufe verketten können zusammen, unabhängig vom Container.

Was Sie möglicherweise wollen, ist ein 'Monad-Transformator', der Ihnen die Möglichkeit gibt, Monaden zu erstellen. Debasish Ghosh hat einen Beitrag zur Verwendung von Scalaz-Monad-Transformatoren hier .

    
Impredicative 01.03.2013 09:59
quelle
0

Sie können nicht alle verschiedenen Typen in einer für das Verständnis mischen, ich fand heraus, dass Sie Seq und Option mischen könnten und das Ergebnis wäre entweder Seq oder Option, je nachdem, was zuerst eintritt. Es ist nicht möglich, Future und Seq oder Option zu mischen. Wenn Sie das Verständnis für das Verständnis nutzen wollen, müssten Sie diese paarweise kaskadieren. In solchen Fällen könnte es mit map / flatMap schöner sein. Ich habe Ihre Frage auf beide Arten implementiert und zu wenigen Zwischenergebnissen Typen hinzugefügt, so dass Sie das Chaos sehen, das bei der Arbeit mit all diesen verschiedenen Typen entsteht.

%Vor%     
Juraj Petrovic 22.09.2016 17:55
quelle

Tags und Links