Scalaz将嵌套的存在类型/验证单子转换为前应用程序构建

4
我收到了以下内容:
gt.map(_.singleVal) |@| lt.map(_.singleVal)

它们的类型为Option(Validation(T)),但应该是Validation(Option(T))

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

我认为这是一件非常普遍的事情。Scalaz中有任何语法糖可以做到这一点吗?

1个回答

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)

一般而言,如果M有一个Traverse实例,而N有一个适用函子实例,那么您可以使用traverse函数(请参见这里的我的答案进行一些额外的讨论),通过给定一个函数A => N[B]M[A]转换为N[M[B]]


嗨Travis,感谢您忽略了我的不准确之处,并提供了详细的答案:D - Hassan Syed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接