Scalaz переворачивает вложенные экзистенциальные/проверочные моно-независимо-нады вокруг предварительного построения приложений

У меня есть следующее:

gt.map(_.singleVal) |@| lt.map(_.singleVal)

Они имеют тип Option(Validation(T)), но должны быть Validation(Option(T))

Это нормально, что что-то не существует, но не нормально, что то, что существует, недействительно. Другими словами, я бы хотел, чтобы None интерпретировалось как Success(None)

Мне показалось, что это очень обычное дело. Есть ли в scalaz сахар, который делает это?


person Hassan Syed    schedule 17.08.2014    source источник


Ответы (1)


Я собираюсь предположить, что под Validation(T) вы подразумеваете что-то вроде ValidationNel[Throwable, T], поскольку Validation[T] ничего не значит, а Validation[E, T] не имеет экземпляра аппликативного функтора, если только E не имеет экземпляр полугруппы.

То, что вы ищете, вероятно, traverse (или traverseU, если вы хотите избежать записи параметров типа). Например, вы можете написать следующее:

scala> case class Foo(singleVal: ValidationNel[Throwable, String])
defined class Foo

scala> val x = some(Foo("hey".success))
x: Option[Foo] = Some(Foo(Success(hey)))

scala> val y = none[Foo]
y: Option[Foo] = None

scala> println(x.traverseU(_.singleVal))
Success(Some(hey))

scala> println(y.traverseU(_.singleVal))
Success(None)

В общем, если M имеет экземпляр Traverse, а N имеет экземпляр аппликативного функтора, вы можете преобразовать M[A] в N[M[B]] с учетом функции A => N[B] с traverse (см. мой ответ здесь для дополнительного обсуждения).

person Travis Brown    schedule 17.08.2014
comment
Эй, Трэвис, спасибо, что не обратили внимания на мою неточность и подробный ответ: D - person Hassan Syed; 17.08.2014