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

Has*_*yed 4 validation scala scalaz applicative

我有以下内容:

gt.map(_.singleVal) |@| lt.map(_.singleVal)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tra*_*own 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)
Run Code Online (Sandbox Code Playgroud)

一般来说,如果M有一个Traverse实例,并N有一个适用函子实例,你可以将一个M[A]成一个N[M[B]]给定函数A => N[B]traverse(见我的答案在这里一些额外的讨论).