2016-12-16 55 views
8

Mam instancję Either[Future[A], Future[B]] i chcę ją przekształcić na Future[Either[A, B]].Jak przekształcić [Przyszłość [A], Przyszłość [B]] na przyszłość [Albo [A, B]]

Od my previous question, cats 0.8.1 został zwolniony, zmieniając strukturę biblioteki i upuszczenie XorEither rzecz, która jest prawym spychany 2,12.

Tak więc metoda opisana w poprzedniej zaakceptowanej odpowiedzi już nie działa. Próbowałem znaleźć odpowiedni import, ale nie udało mi się.

cats.instances.either._ 
cats.implicits._ 
cats.syntax.bitraverse._ 

wyglądało na wiarygodne, ale niestety nie działa. Kompilacja nadal kończy się niepowodzeniem. Zwiększenie importów do *.all._ nie zmieniło błędu kompilatora.

jestem na Scala 2.11.8 ponieważ nie wszystkie biblioteki projektu zależy wydali wersję dla 2,12

+2

'either.fold (_ map (. Left (_)), _.map (Right (_))) ', ale jak to jest związane z kotami? –

+0

Próbowałem tego z kotami 0.8.1 i scala 2.11.8 i 2.12.1, oraz 'bisequence' na' Albo [Future [A], Future [B]] 'działa w obu wersjach. Czy masz zasięg "ExecutionContext" w zakresie? Jest to wymagane dla 'Applicative [Future]' – Kolmar

+0

@Kolmar - tak, importuję niejawny 'ExecutionContext'. To dziwne, oczyściłem projekt przed kompilacją. Czy używasz tych samych 3 importów, które zrobiłem? – kostja

Odpowiedz

4

Zebraliśmy odpowiedzi od komentarzy na temat wygody czytelnika:

1: można to zrobić w zwykłym Scala (używając cats.Functor dla definicji tutaj), dzięki uprzejmości @wheaties & @ jean-philippe-peletu

def eitherFmap[F[_], A, B](either: Either[F[A], F[B])(implicit F: Functor[F]): F[Either[A, B]] = 
either.fold(f => F.map(f)(Left(_)), f => F.map(f)(Right(_))) 

2: koty bisequence odmówił skompilować z powodu sprzecznych import: pojedynczy import wystarczy tu - dzięki uprzejmości @kolmar

import cats.instances._ 
... 
val futureOfEither = eitherOfFutures.bisequence 

3: czytać cats import guide aby uniknąć tego problemu w przyszłości - dzięki uprzejmości @ peter-neyens