1

私は顧客タイプを持っていQueryResultます

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

複数のクエリを実行すると、 が得られますがList[QueryResult[A]]、 が必要ですQueryResult[List[A]]sequences のメソッドを実装することもできますが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 に答える