flatMap 与 ValidationNel 的析取

flatMap a disjunction with a ValidationNel

我需要一个组合器,它 flatMap 一个析取 (\/) 与 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 但没有 sugar-y 名称——我希望 Scalaz 有类似的东西。