2012-10-12 53 views
10

如果我有一個單子轉換型採用兩個類型參數,我可以用liftM解除值到轉化單子:如何使用Scalaz 7的EitherT與liftM

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

但是,如果我試圖用同樣的事EitherT好像我必須用一個類型別名(或類型拉姆達):

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] 

什麼是做到這一點的正確方法?理想情況下,使用預期的表達式類型(如val blah: EitherT[List, String, Int] = 1.point[List].liftM)來推斷liftM的類型參數。

回答

8

似乎沒有成爲一個更好的方式來處理一般的多參數類型構造,但在EitherT特定情況下,我們可以使用EitherT.right

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