Как реализовать Scalaz Applicative?

У меня есть тип клиента QueryResult, который

type QueryResult[A] = A org.scalactic.Or One[Error]

При выполнении нескольких запросов я получаю List[QueryResult[A]], но мне нужен QueryResult[List[A]]. Я могу реализовать метод sequence для Lists, но мне нужен более общий, поэтому я попытался создать его с помощью Scalaz.

def sequence2[A, T[_]: Traverse](traversable: T[QueryResult[A]])
    (implicit app: Applicative[QueryResult]): QueryResult[T[A]] = {
  app.sequence(traversable)
}

Кажется, это работает, но не компилируется, потому что нет неявного параметра app для Applicative[QueryResult].

Как его создать? Или Scalaz может как-то «волшебным образом» сгенерировать его?


person Joost den Boer    schedule 23.06.2016    source источник


Ответы (1)


Это должно работать:

import scalaz.Applicative

implicit val queryApplicative: Applicative[QueryResult] = 
  new Applicative[QueryResult] {
    def point[A](a: => A): QueryResult[A] = Good(a)
    def ap[A, B](fa: => QueryResult[A])(f: => QueryResult[A => B]): QueryResult[B] = 
      f.flatMap(ff => fa.map(ff))
  }

Я также не думаю, что вам нужно определять sequence2 самостоятельно, вы должны уметь:

import scalaz.std.list._
import scalaz.syntax.traverse._

List(1.point[QueryResult], 2.point[QueryResult]).sequence
person Peter Neyens    schedule 23.06.2016