Scala scalaz.Monad[scala.concurrent.Future], какво ще кажете за контекста на изпълнение?

Виждам няколко въпроса, които използват scalaz Monad за нещо, което изглежда като scala Future. Тук и тук. Не съм виждал задоволителен начин за разрешаване на това като имплицитен тип клас без използване на глобален контекст на изпълнение, но смятам, че импортирането на тези типови класове не трябва да има статично знание за контекста. Има ли нещо, което пропускам тук? (Предполагам, че не използват scalaz.concurrent.Future)


person J Pullar    schedule 09.11.2014    source източник


Отговори (1)


ExecutionContext просто трябва да бъде имплицитно достъпен на сайта за повикване, където е известно, че вашата монада е Бъдеще. Съгласен съм, че има известна неудобство около потенциално множество различни дефиниции на вашия клас тип, съществуващ във вашата програма, но няма нужда да зависи от статичното му внедряване.

import scala.concurrent.Future
import scalaz._
import Scalaz._

def foo[A, T[_]: Traverse, M[_]: Monad](t: T[M[A]]): M[T[A]] =
  implicitly[Traverse[T]].sequence(t)

def bar(l: List[Future[Int]])(implicit ctx: ExecutionContext): Future[List[Int]] = 
  foo(l)

https://github.com/scalaz/scalaz/blob/v7.1.0/core/src/main/scala/scalaz/std/Future.scala#L8

person drstevens    schedule 10.11.2014
comment
Имайте предвид, че само Applicative е необходим на foo и това трябва да се използва като ограничение на типа тук вместо това. Избрах Monad само защото въпросът го прави. - person drstevens; 10.11.2014