Как использовать 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]
Каков правильный способ сделать это? В идеале выведите аргумент типа для liftM
, используя ожидаемый тип выражения (что-то вроде val blah: EitherT[List, String, Int] = 1.point[List].liftM
).
Ответы
Ответ 1
Кажется, что нет лучшего способа обработки конструкторов типа с несколькими аргументами, но в конкретном случае EitherT
мы можем использовать EitherT.right
:
scala> val o: EitherT[List, String, Int] = EitherT.right(1.point[List])
o: scalaz.EitherT[List,String,Int] = [email protected]