我对 scalaz 还很陌生,我已经从验证开始。
我有一些表单的验证功能:
def validateXyz(...): ValidationNEL[String, String] = ...
然后我使用 applicative 样式来组合多个验证,然后调用另一个也返回验证的函数:
(validateXyz(...) |@| validateAbc(...)) { (first, second) =>
otherFunction(first, second)
}
在哪里,
def otherFunction(first: String, second: String): ValidationNEL[String, String] = ...
但是,当调用上面的结果类型是:
val result: ValidationNEL[String, ValidationNEL[String, String]] = ...
我可以通过使用两个函数在结果上调用 fold 来解压它,第一个只是将 NEL 作为失败传播,第二个只是传播其参数:
def propagateF(result: NonEmptyList[String]): ValidationNEL[String, String] = result.fail
def propagateV(result: ValidationNEL[String, String]) = result
result.fold(propagateF, propagateV)
// result type: ValidationNEL[String, String]
这有效并返回正确的类型和结果。但是,它感觉不是正确的解决方案,所以我必须遗漏一些东西。我需要做些什么来避免最后出现这种可怕的折叠?