我想验证一个人的多个字段,并返回一个带有所有相关错误的Validated对象。我使用kotlin版本1.3.41和箭头0.8.2。
我有以下课程:
class Person(id: Long, name: String)
sealed class PersonError {
data class InvalidId(val field: String) : PersonError()
data class InvalidName(val field: String) : PersonError()
}
因此,当我进行验证时,我希望返回以下结果类型:
Validated<List<PersonError>, Person>
箭头库文档并不是真正的帮助,因为我是函数式编程的新手。视频中的示例未使用最新的箭头版本进行编译,它需要一个半组:
Validated.applicative<PersonError>(**SEMIGROUP**).map(vId, vName, { id, name
Person(id, name)
}).ev()
另一种用法是Emmanuel Nhan的实现,也无法使用最新的kotlin版本:https://github.com/enhan/validation-case/blob/master/src/main/kotlin/eu/enhan/validation/kotlin/sample.kt
进行编译。答案 0 :(得分:0)
该解决方案来自Emmauel Nhan,请阅读他的博客:https://www.enhan.eu/how-to-in-fp/
ValidatedNel.applicative<Nel<PersonError>>(Nel.semigroup<PersonError>())
.map(id, name){
val id = it.a
val name = it.b
Person(id, name)
}.fix()
结果上方:Validated<Nel<PersonError>, Person>