Виждам няколко въпроса, които използват scalaz Monad за нещо, което изглежда като scala Future. Тук и тук. Не съм виждал задоволителен начин за разрешаване на това като имплицитен тип клас без използване на глобален контекст на изпълнение, но смятам, че импортирането на тези типови класове не трябва да има статично знание за контекста. Има ли нещо, което пропускам тук? (Предполагам, че не използват scalaz.concurrent.Future)
Scala scalaz.Monad[scala.concurrent.Future], какво ще кажете за контекста на изпълнение?
Отговори (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
Имайте предвид, че само
Applicative
е необходим на foo
и това трябва да се използва като ограничение на типа тук вместо това. Избрах Monad
само защото въпросът го прави.
- person drstevens; 10.11.2014