2012-10-12 9 views
10

Jeśli mam typ transformatora monada biorąc dwa argumenty typu, można użyć liftM do podnoszenia wartości do przekształconej monady:Jak korzystać Scalaz 7 za EitherT z liftM

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

Jednakże jeśli próbuję samo z EitherT wydaje się, że muszę użyć aliasu typu (lub typu 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] 

Jaki jest właściwy sposób to zrobić? Idealnie wnioskowanie o typie argumentu dla liftM przy użyciu oczekiwanego typu wyrażenia (coś takiego jak val blah: EitherT[List, String, Int] = 1.point[List].liftM).

Odpowiedz

8

Nie wydaje się być lepszym sposobem obsługi konstruktorów typu multi-argument w ogóle, ale w konkretnym przypadku EitherT, możemy użyć EitherT.right:

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