0

我真的在努力使用箭头库的 Validated 类型。

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

我来自“任何一个世界”,这根本不是问题。但是我需要组合多个错误,所以我的核心验证类型是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 这样的简单操作。

有人知道该怎么做吗?

4

1 回答 1

1

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

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

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

于 2019-08-26T20:14:19.627 回答