加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala-Cats验证:值mapN不是ValidatedNel元组的成员

发布时间:2020-12-16 08:55:41 所属栏目:安全 来源:网络整理
导读:Scala社区. 目前我正在尝试使用猫Validated Monad实现自定义模型/单参数验证.但是,自从1.0删除笛卡尔积后,我无法使用(v1 | @ | v2)map(f)并且无法编译我的代码: import cats.Semigroupalimport cats.data.Validated.{Invalid,Valid}import cats.data.{Valid
Scala社区.

目前我正在尝试使用猫Validated Monad实现自定义模型/单参数验证.但是,自从1.0删除笛卡尔积后,我无法使用(v1 | @ | v2)map(f)并且无法编译我的代码:

import cats.Semigroupal
import cats.data.Validated.{Invalid,Valid}
import cats.data.{ValidatedNel,_}
import cats.implicits._
import cats.instances.all._

case class FieldErrorInfo(name: String,error: String)

type FieldName = String

type ValidationResult[A] = ValidatedNel[FieldErrorInfo,A]

trait SingleFieldValidationRule[U] extends ((U,FieldName) => ValidationResult[U])

trait ModelValidationRule[M] extends (M => ValidationResult[M])

object ValidateNameRule extends SingleFieldValidationRule[String] {
  override def apply(v1: String,name: String): ValidationResult[String]  = {
    if (v1.contains("cats"))
      v1.validNel
    else
      FieldErrorInfo(name,"Some Error").invalidNel
  }
}

object ValidateQuantityRule extends SingleFieldValidationRule[Int] {
  override def apply(v1: Int,name: String): ValidationResult[Int] =
    if (v1 > 0)
      v1.validNel
    else FieldErrorInfo(name,"Some Error").invalidNel
}

case class SampleModel(name: String,quantity: Int)

object ValidateSampleModel extends ModelValidationRule[SampleModel] {
  override def apply(v1: SampleModel): ValidationResult[SampleModel] = {
    val stage1: ValidatedNel[FieldErrorInfo,String] = ValidateNameRule(v1.name,"name")
    val stage2: ValidatedNel[FieldErrorInfo,Int] = ValidateQuantityRule(v1.quantity,"quantity")

    implicit val sga: Semigroupal[NonEmptyList] = new Semigroupal[NonEmptyList] {
      override def product[A,B](fa: NonEmptyList[A],fb: NonEmptyList[B]): NonEmptyList[(A,B)] = fa.flatMap(a => fb.map(b => a -> b))
    }

    (stage1,stage2).mapN(SampleModel)
  }
}

编译器说,那

Error:(43,23) value mapN is not a member of (cats.data.ValidatedNel[FieldErrorInfo,String],cats.data.ValidatedNel[FieldErrorInfo,Int])
    (stage1,stage2).mapN(SampleModel)
                     ^

请指出如何使用新的Applicative语法或我做错了…(忘了创建/导入一些含义)

解决方法

值stage1和stage2的类型必须为ValidationResult [_].

在这种情况下,mapN的隐含应该起作用.

object ValidateSampleModel extends ModelValidationRule[SampleModel] {
  override def apply(v1: SampleModel): ValidationResult[SampleModel] = {
    val stage1: ValidationResult[String] = ValidateNameRule(v1.name,"name")
    val stage2: ValidationResult[Int] = ValidateQuantityRule(v1.quantity,"quantity")

    (stage1,stage2).mapN(SampleModel)
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读