1

我想验证一个 Person 的多个字段并返回一个包含所有相关错误的 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 /样本.kt

4

1 回答 1

1

解决方案来自 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>

于 2019-07-06T20:25:58.720 回答