我对scalaz还不太熟悉,我从验证开始学起。
我有一些形式为以下的验证函数:
def validateXyz(...): ValidationNEL[String, String] = ...
我随后使用应用程序样式来组合多个验证,然后调用另一个也返回验证的函数:
(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]
这段代码可以正常运行并返回正确的类型和结果。但是,它似乎不是正确的解决方案,所以我肯定遗漏了什么。我需要做什么来避免最后的可怕折叠?