Как реализовать Scalaz Applicative?
У меня тип клиента QueryResult
который
type QueryResult[A] = A org.scalactic.Or One[Error]
При выполнении нескольких запросов я получаю List[QueryResult[A]]
, но я хочу QueryResult[List[A]]
, Я могу реализовать sequence
метод для List
но я хотел бы более общий, поэтому я попытался создать его с помощью Scalaz.
def sequence2[A, T[_]: Traverse](traversable: T[QueryResult[A]])
(implicit app: Applicative[QueryResult]): QueryResult[T[A]] = {
app.sequence(traversable)
}
Кажется, это работает, но не компилируется, потому что нет неявного параметра app
для Applicative[QueryResult]
,
Как мне его создать? Или Скалаз может каким-то образом "волшебным образом" генерировать его?
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