Почему не работает последовательность со списком проверок

Я думаю, что я понимаю, что это за последовательность. Мне интересно, почему это не работает с List[ValidationNel], Например:

sequence отлично работает с List[Option]]

scala> val os = List(1.some, 2.some)
os: List[Option[Int]] = List(Some(1), Some(2))

scala> os.sequence
res10: Option[List[Int]] = Some(List(1, 2))

... но не работает с List[ValidationNel]

scala> val vs: List[ValidationNel[String, Int]] = List(Success(1), Success(2))
vs: List[scalaz.ValidationNel[String,Int]] = List(Success(1), Success(2))

scala> vs.sequence
<console>:15: error: could not find implicit value for parameter ev:scalaz.Leibniz.===[scalaz.ValidationNel[String,Int],G[B]]

... тем не мение sequenceU работает с List[ValidationNel]

scala> vs.sequenceU
res14: scalaz.Validation[scalaz.NonEmptyList[String],List[Int]] = Success(List(1, 2))

Мои вопросы: почему нет sequence работать с List[ValidationNel]? Почему sequenceU работать с этим?

2 ответа

Решение

.sequenceU использует технику Unapply для получения правильных типов, тогда как для.sequence вам необходимо вручную указать типы для него.

Чтобы сделать вещи немного более раздражающими, первый аргумент типа последовательности должен иметь параметр типа, который принимает один параметр типа, а не два, как ValidationNel. Таким образом, вы либо набираете лямбду, либо делаете определение локального типа.

Пытаться

type X = ValidationNel[String,X]

vs.sequence[X, Int]

или же

vs.sequence[({type l[A]=ValidationNel[String,A]})#l,Int]

Не эксперт по Скалазу.

Короче говоря, потому что ValidationNel не является монадой, поэтому это преобразование недопустимо:

List [ValidationNel [SomeType]] => ValidationNel [List [SomeType]]

как показывает сообщение об ошибке: implicit value not found, что указывает на отсутствие такого преобразования.

Другие вопросы по тегам