将Scalaz版本升级到7.2后,我遇到了验证问题。以下代码适用于之前的Scalaz版本。
def registerOrUpdate(enc: EncAdt, dx: List[DiagnosisAdt], provs: List[Provider], plans: List[InsurancePlan]): ValidationNel[AdtError, String \/ Int] = {
// First check that admit date is after contract start
enc.admitDT.fold[ValidationNel[AdtError, String \/ Int]](
MissingAdmitDate(enc).failureNel
) { admitTstamp =>
val beforeContractDate = fac.dosStart.exists(_ isAfter new DateTime(admitTstamp.getTime))
if (enc.accountNumber.trim == "") {
MissingFin(enc).failureNel
} else {
...
在升级Scalaz版本后,正在生成以下问题。
fold does not take type parameters
任何解决方案都是可观的。
既然你再次没有在你的问题中提供Minimal, Complete, and Verifiable example,那么很难帮助你。如果我从我的AdtValidation
复制第一个previous answer仍然是:
object AdtValidation {
type AdtValidation[A] = ValidationNel[AdtError, A]
implicit class AdtValidationSuccess[A](val value: A) extends AnyVal {
def successAdt: AdtValidation[A] = Validation.success[NonEmptyList[AdtError], A](value)
}
implicit class AdtValidationFailure(val value: AdtError) extends AnyVal {
def failureAdt[A]: AdtValidation[A] = Validation.failureNel[AdtError, A](value)
}
}
然后你的代码的以下简化为我编译(假设你定义了其他类,如EncAdt
或MissingAdmitDate
)
import AdtValidation._
// the original works as well but this seems better to me
def registerOrUpdate(enc: EncAdt): AdtValidation[String \/ Int] = {
//def registerOrUpdate(enc: EncAdt): ValidationNel[AdtError, String \/ Int] = {
// First check that admit date is after contract start
enc.admitDT.fold[ValidationNel[AdtError, String \/ Int]](
// MissingAdmitDate(enc).failureNel
MissingAdmitDate(enc).failureAdt
) { admitTstamp =>
// val beforeContractDate = fac.dosStart.exists(_ isAfter new DateTime(admitTstamp.getTime))
if (enc.accountNumber.trim == "") {
// MissingFin(enc).failureNel
MissingFin(enc).failureAdt
} else {
//...
-\/(enc.transactionID.toString).successNel // this works
-\/(enc.transactionID.toString).successAdt // this also works
}
}
}
希望这可以帮助。