我需要一个组合器,将析取 (\/
) 与 ValidationNel
进行平面映射。
这是我的尝试:
def flatMap[A, B, C](d: \/[A, B], f: B => ValidationNel[A, C]) : ValidationNel[A, C] =
d.leftMap(_.wrapNel).flatMap(f(_).disjunction).validation
有更优雅的解决方案吗?
最佳答案
在这种情况下,我只是折叠析取 - 它更简洁并且创建更少的中间值:
import scalaz._, Scalaz._
def flatMap[A, B, C](
d: \/[A, B],
f: B => ValidationNel[A, C]
): ValidationNel[A, C] = d.fold(_.failureNel[C], f)
您还可以导入Validation.FlatMap._
,然后使用d.validationNel.flatMap(f)
,但我不推荐这样做。我喜欢 Cats 在其验证类型上有一个 andThen
方法,类似于 flatMap
但没有糖名 - 我希望 Scalaz 也有类似的东西。
关于scala - flatMap 与 ValidationNel 的析取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34581718/