2012-10-12 8 views
10

verwenden, wenn ich einen Monade Transformatortyp unter zwei Typargumente habe, kann ich liftM verwenden, um Werte in den transformierten Monade zu heben:Wie Scalaz 7s EitherT mit liftM

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

Allerdings, wenn ich die gleiche Sache versuchen, mit EitherT es scheint, als ob ich eine Art Alias ​​(oder einen Typ Lambda) verwenden müssen:

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] 

Was ist der richtige Weg, dies zu tun? Idealerweise leitet man das Argument type für liftM mit dem erwarteten Typ des Ausdrucks ab (etwa val blah: EitherT[List, String, Int] = 1.point[List].liftM).

Antwort

8

Es scheint keine bessere Art und Weise zu handhaben Multi-Argument Typkonstruktoren im Allgemeinen zu sein, aber im konkreten Fall von EitherT, können wir verwenden EitherT.right:

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