2012-10-12 8 views
10

Nếu tôi có một loại đơn nguyên biến áp dùng hai tham số kiểu, tôi có thể sử dụng liftM để nâng giá trị vào các đơn nguyên chuyển:Làm thế nào để sử dụng EitherT Scalaz 7 với liftM

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

Tuy nhiên nếu tôi cố gắng điều tương tự với EitherT có vẻ như tôi phải sử dụng bí danh loại (hoặc loại 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] 

Cách thích hợp để làm điều này là gì? Lý tưởng nhất là suy luận loại đối số cho liftM bằng cách sử dụng loại biểu thức mong muốn (chẳng hạn như val blah: EitherT[List, String, Int] = 1.point[List].liftM).

Trả lời

8

Dường như không phải là một cách tốt hơn để xử lý nhà xây dựng kiểu đa lập luận nói chung, nhưng trong trường hợp cụ thể của EitherT, chúng ta có thể sử dụng EitherT.right:

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