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) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |