2016-06-23 10 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