2012-10-12 64 views
10

Si tengo un tipo de transformador mónada tomar dos argumentos de tipo, puedo usar liftM para levantar los valores en la mónada transformado:Cómo utilizar EitherT de Scalaz 7 con liftM

scala> val o = 1.point[List].liftM[OptionT] 
o: scalaz.OptionT[List,Int] = OptionT(List(Some(1))) 

Sin embargo si intento lo mismo con EitherT parece que debo usar un alias de tipo (o un tipo lambda):

scala> val e = 1.point[List].liftM[({type l[a[+_],b] = EitherT[a, String, b]})#l] 
e: scalaz.EitherT[List,java.lang.String,Int] = [email protected] 

¿Cuál es la forma correcta de hacer esto? Lo ideal es inferir el argumento de tipo para liftM usando el tipo esperado de la expresión (algo así como val blah: EitherT[List, String, Int] = 1.point[List].liftM).

Respuesta

8

No parece ser una mejor manera de manejar constructores de tipo multi-argumento en general, pero en el caso específico de EitherT, podemos utilizar EitherT.right:

scala> val o: EitherT[List, String, Int] = EitherT.right(1.point[List]) 
o: scalaz.EitherT[List,String,Int] = [email protected]