Kotlin 箭头组合验证列表
Kotlin arrow combine list of validated
我有以下 类:
class Person(id: Long, name: String)
sealed class PersonError {
data class InvalidId(val field: String) : PersonError()
data class InvalidName(val field: String) : PersonError()
}
当我循环并通过多人验证时,我得到:
List<ValidatedNel<Error, Person>>
或:
List<Validated<Error, Person>>
如何将上面的列表转换为:
Validated<Nel<MappingError>, List<Person>>
我想累积与所有人验证相关的所有错误。这是必需的,因为我想执行以下操作:
val vId : ValidatedNel<Error, Long> = validateId(id).toValidatedNel()
val vPersons : List<ValidatedNel<Error, Person>> = validatePersons(persons).toValidatedNel()
ValidatedNel.applicative<Nel<PersonError>>(Nel.semigroup<PersonError>())
.map(vId, vPersons) {
val id = it.a
val persons = it.b
Group(id, persons)
}.fix()
当前'map'不接受List<ValidatedNel<Error>, Person>>
Validated
左边需要一个Semigroup
来收集所有错误; Validated
的右侧需要 product
(因为 Group(a, b)
是产品类型);并且特定人内的错误累积需要 sequence
(或具有身份功能的 traverse
)来收集给定人的所有错误,因此以下内容应该有效:
val SE = Nel.semigroup<PersonError>()
val validatedGroup: ValidatedNel<PersonError, Group> = vId.product(
SE,
vPersons.sequence(ValidatedNel.applicative(SE)).fix().map { it.fix() }
).map(::Group.tupled2())
我认为在即将发布的 Arrow 版本中,将最大限度地减少或消除对 fix() 的调用,因此希望 .fix().map { it.fix() }
可以尽快删除。
我有以下 类:
class Person(id: Long, name: String)
sealed class PersonError {
data class InvalidId(val field: String) : PersonError()
data class InvalidName(val field: String) : PersonError()
}
当我循环并通过多人验证时,我得到:
List<ValidatedNel<Error, Person>>
或:
List<Validated<Error, Person>>
如何将上面的列表转换为:
Validated<Nel<MappingError>, List<Person>>
我想累积与所有人验证相关的所有错误。这是必需的,因为我想执行以下操作:
val vId : ValidatedNel<Error, Long> = validateId(id).toValidatedNel()
val vPersons : List<ValidatedNel<Error, Person>> = validatePersons(persons).toValidatedNel()
ValidatedNel.applicative<Nel<PersonError>>(Nel.semigroup<PersonError>())
.map(vId, vPersons) {
val id = it.a
val persons = it.b
Group(id, persons)
}.fix()
当前'map'不接受List<ValidatedNel<Error>, Person>>
Validated
左边需要一个Semigroup
来收集所有错误; Validated
的右侧需要 product
(因为 Group(a, b)
是产品类型);并且特定人内的错误累积需要 sequence
(或具有身份功能的 traverse
)来收集给定人的所有错误,因此以下内容应该有效:
val SE = Nel.semigroup<PersonError>()
val validatedGroup: ValidatedNel<PersonError, Group> = vId.product(
SE,
vPersons.sequence(ValidatedNel.applicative(SE)).fix().map { it.fix() }
).map(::Group.tupled2())
我认为在即将发布的 Arrow 版本中,将最大限度地减少或消除对 fix() 的调用,因此希望 .fix().map { it.fix() }
可以尽快删除。