Scalaz在预应用程序构建周围翻转嵌套的存在/验证单一文本

时间:2014-08-17 17:22:06

标签: scala validation scalaz applicative

我有以下内容:

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

它们属于Option(Validation(T))类型,但它们应为Validation(Option(T))

某些东西不存在是可以的,但对于存在无效的东西是不行的。换句话说,我希望将None解释为Success(None)

这让我感到非常普遍。 scalaz中有没有这样做的糖吗?

1 个答案:

答案 0 :(得分:7)

我假设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)

一般情况下,如果MTraverse个实例而N有一个应用仿函数实例,则可以将M[A]转换为N[M[B]]给定函数A => N[B] traverse {{1}}(有关其他讨论,请参阅my answer here)。