2016-06-23 11 views
1

は私がScalaz Applicativeの実装方法は?

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

複数のクエリをやって、私はList[QueryResult[A]]を取得している顧客タイプQueryResultを持っているが、私はQueryResult[List[A]]をしたいです。 Listについてはsequenceメソッドを実装できますが、より一般的なものを使用したいので、Scalazで作成しようとしました。

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

これは動作するようですが、Applicative[QueryResult]には暗黙のパラメータappが存在しないため、コンパイルされません。

作成方法を教えてください。 Scalazは何とか「魔法のように」何とか何かを生成することができますか?

答えて

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 
関連する問題