2017-10-03 4 views
1

SCALA, j'ai un type de récipient avec un cas d'erreur et le type a eu lieu:Mise en œuvre du classe de types Monad avec un type multi-paramètres

case class Extract[E, A](runView: View => EitherT[Future, E, (A, View)]) {...} 

que je compte utiliser comme une sorte de monade d'état asynchrone. J'ai implémenté toutes les méthodes utilitaires map, flatMap pour cela. Je veux maintenant marquer ce type comme étant un membre de la classe de type Monad dans scalaz, et j'ai du mal à élaborer la syntaxe pour spécifier que le paramètre de type que je veux le type monadic sur est le type A, puisque Monad prend un type avec un seul paramètre de type. Voici une tentative incorrecte que j'ai faite.

implicit def extractInterface[E] = new Monad[Extract[E, A]] { 
    def point[A](a: => A): Extract[E, A] = {...} 
    def bind[A, B](fa: Extract[E, A])(f: (A) => Extract[E, B]): Extract[E, B] = fa.flatMap(f) 
} 

J'ai essayé de regarder les instances de scalaz pour E \/ A, mais ils utilisent un paramètre de type ?, pour lequel je ne peux pas trouver une définition.

Existe-t-il une astuce syntaxique pour faire ce que je veux?

Répondre

3

Vous devez utiliser type lambda

implicit def extractInterface[E] = new Monad[({ type λ[A] = Extract[E, A] })#λ] { 
    ... 
} 

Vous pouvez également utiliser kind-projector plug-in.

implicit def extractInterface[E] = new Monad[Extract[E, ?]] { 
    ... 
} 

What is the ? type?