【问题标题】:Kotlin arrow combine list of validatedKotlin 箭头组合已验证列表
【发布时间】:2019-07-06 20:24:50
【问题描述】:

我有以下课程:

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()

当前的“地图”不接受List&lt;ValidatedNel&lt;Error&gt;, Person&gt;&gt;

【问题讨论】:

    标签: kotlin kotlin-coroutines arrow-kt


    【解决方案1】:

    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() } 可以很快被删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 2015-05-04
      相关资源
      最近更新 更多