2016-03-04 8 views
-1

У меня есть это:Реализовать Future.sequence для случая класса CanBuildFrom проходимой итератора последовательности Монады

case class Sides[A](east: A, west: A) 

Я хочу, чтобы преобразовать этот Sides[Future[Boolean]] в этот Future[Sides[Boolean]]

используя Future.sequence как?

Это docs:

def 
sequence[A, M[X] <: TraversableOnce[X]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] 
Permalink 
Simple version of Future.traverse. Transforms a TraversableOnce[Future[A]] into a Future[TraversableOnce[A]]. Useful for reducing many Futures into a single Future 
+0

Вы должны реализовать 'траверс [Sides]'. Это не будет «Future.sequence» (нет такой вещи, без запуска Будущего), но «Sides.sequence». –

+0

Если вы читаете определение 'sequence', вы увидите ' '' def sequence [A, M [X] <: TraversableOnce [X]] (в: M [Future [A]]) (неявный cbf : CanBuildFrom [M [Future [A]], A, M [A]], исполнитель: ExecutionContext): Future [M [A]] '' ' Итак, ваши« стороны »должны быть подклассом' TraversableOnce'. – mfirry

+0

@mfirry вы можете реализовать это, пожалуйста, я не могу сделать вещь «CanBuildFrom». – user3995789

ответ

1

EDIT: Поскольку этот вопрос имеет scalaz тег, я предполагал, что Future в вопросе был от scalaz. После того, как вопрос был отредактирован, ясно, что OP имеет Future из стандартной библиотеки Scala.


Я расширяю свой комментарий в качестве ответа. Вам нужен пример Traverse для Sides, а не Future. (Там не существует Traverse экземпляра для Future, если вы не готовы охотно оценить Future.)

import scalaz.{Applicative, Traverse} 
import scalaz.concurrent.Future 
import scalaz.syntax.traverse._ 

case class Sides[A](east: A, west: A) 

implicit def traverseSides: Traverse[Sides] = new Traverse[Sides] { 
    def traverseImpl[G[_], A, B](s: Sides[A])(f: A => G[B])(implicit G: Applicative[G]): G[Sides[B]] = 
    G.apply2(f(s.east), f(s.west))(Sides(_, _)) 
} 

val sf: Sides[Future[Boolean]] = ??? 
vaf fs: Future[Sides[Boolean]] = sf.sequence 
+0

Спасибо, это работает, но «Будущая последовательность» не с нетерпением оценивает, я думаю, это то, что я хочу. – user3995789

+0

@ user3995789 Непонятно, о каком будущем мы говорили. 'Future.sequence [A, M [_]]' из stdlib использует прослеживаемую структуру 'M', а не' Future', так что это согласуется с тем, что я сказал, - что 'Future' не может быть пройден, если вы не заставите его оценить. –