我试图按顺序验证字符串列表,并定义验证结果类型如下:
import cats._, cats.data._, cats.implicits._
case class ValidationError(msg: String)
type ValidationResult[A] = Either[NonEmptyList[ValidationError], A]
type ListValidationResult[A] = ValidationResult[List[A]] // not a monad :(我想把ListValidationResult变成单曲。我应该手动实现flatMap和pure,还是有更简单的方法?
发布于 2017-04-04 16:53:28
我建议你采取一种完全不同的方法,利用cats Validated
import cats.data.Validated.{ invalidNel, valid }
val stringList: List[String] = ???
def evaluateString(s: String): ValidatedNel[ValidationError, String] =
if (???) valid(s) else invalidNel(ValidationError(s"invalid $s"))
val validationResult: ListValidationResult[String] =
stringList.map(evaluateString).sequenceU.toEither根据您的示例,可以将其改编为泛型类型T。
备注:
val stringList: List[String] = ???是要验证的字符串列表;ValidatedNel[A,B]只是Validated[NonEmptyList[A],B]的一个类型别名;evaluateString应该是您的评估函数,它目前只是一个未实现的存根if;sequenceU您可能想阅读有关它的cats文档: sequenceU(http://typelevel.org/cats/api/cats/Traverse.html#sequenceU[GA](fga:F[GA]%29(implicitU:cats.Unapply[cats.Applicative,GA]%29:U.M[F[U.A]]);toEither就像你想的那样,它将一个Validated[A,B]转换成一个Either[A,B]。@Michael指出,您也可以使用traverseU而不是map和sequenceU
val validationResult: ListValidationResult[String] =
stringList.traverseU(evaluateString).toEitherhttps://stackoverflow.com/questions/43211940
复制相似问题