【问题标题】:Kotlin arrow-kt missing flatMap on Validated and ValidatedNelKotlin arrow-kt 在 Validated 和 ValidatedNel 上缺少 flatMap
【发布时间】:2019-08-27 04:14:19
【问题描述】:

我真的在为箭头库的 Validated 类型苦苦挣扎。

我不明白的是:为什么在使用 Validated 时没有 flatMapflatten

我来自“任何一个世界”,这根本不是问题。但是我需要合并多个错误,所以我的核心验证类型最终是ValidatedNel<Error, Data>

在我的代码示例中,我有一个生成 Either 的函数 - 我使用这些低级步骤来创建我需要的元素或错误。

但是要结合所有累积的错误进行正确验证,我迟早需要ValidatedNel 类型。

fun readData(): Either<Error, DataA> = ...
fun DataA.validate(): ValidatedNel<Error, DataB> = ...

[...]
// here I need to fold to get my one Error to a Nel and to process the data to another type - this looks so ugly!
val validated = readData().fold( { it.invalidNel() }, DataA::validate)

我想要的是:

fun readData(): ValidatedNel<Error, DataA> = ...

// ...
val validated = readData.flatMap(DataA::validate)

我只是不明白为什么验证类型不支持像 flatMap 这样的简单操作。

有人知道该怎么做吗?

【问题讨论】:

    标签: validation kotlin arrow-kt


    【解决方案1】:

    验证只需要ApplicativeMonoid;它不需要Monad。或者,简单地说:验证数据的事情可以以任何顺序发生 (Applicative),并且多次验证会累积错误,通常是通过连接错误列表 (Monoid)。验证通常不相互依赖或需要特定的计算序列 (Monad)。

    依赖验证可能最好表示为 Either 链,然后在链完成后转换为 Validation

    Scala Cats 库在这里有一个很好的解释:https://typelevel.org/cats/datatypes/validated.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多