1

我有一个客户类型QueryResult

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

进行多个查询时,我得到一个List[QueryResult[A]],但我想要一个QueryResult[List[A]]. 我可以sequence为 s 实现一个方法,List但我想要一个更通用的方法,所以我尝试用 Scalaz 创建一个。

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

这似乎可行,但无法编译,app因为Applicative[QueryResult].

如何创建一个?或者 Scalaz 能否以某种方式“神奇地”生成一个?

4

1 回答 1

3

这应该工作:

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
于 2016-06-23T09:51:50.890 回答