我正在使用函数库 arrow-kt
进行编程(以前称为 kategory
)。我正在使用 Either
monad 用于聚合 api 调用的错误或成功信息。我让自己进入了一个状态(这首先不应该发生)我有一个嵌套 Either
单子(monad)。我正在尝试使结构变平以获取内部单子(monad)。文档非常有限,我找不到解决方法。
这是我想展平的嵌套 Either monad 的示例:
Either.right(Either.right(Either.left("error")))
最佳答案
你可以用 flatten
来展平这样的结构。 :
import arrow.core.*
import arrow.typeclasses.*
val result = Either.right(Either.right(Either.left("error")))
Either.monad<String>().flatten(result)
// keep flattening until you are happy with the result
// Right(b=Left(a=error))
或者只是
flatMap
:import arrow.core.*
import arrow.typeclasses.*
val result = Either.right(Either.right(Either.left("error")))
result.flatMap { it.flatMap { it } }
// Left(a=error)
您最终得到这种嵌套结构的事实可能意味着您在程序中的某个时刻没有使用正确的数据类型或错误的抽象,因为这是一种无用的值。
如果您希望保留评论中指出的左侧值,我认为更合适的数据类型是
Validated
允许误差累积,如此处所示 http://arrow-kt.io/docs/datatypes/validated/或者
Either#fold
可以帮助您考虑这两种情况,然后将其合并为您想要的任何值。我假设您已经遇到了这些大部分内容的解释,但以防万一一些有用的链接可以帮助您使用 Arrow 进行建模
此外,如果您需要与维护人员和其他贡献者之间的互动体验,比我们经常帮助各个级别的人学习 FP 和 Arrow 的方式更具互动性,请随意使用我们的聊天 channel 。
干杯!
关于functional-programming - Kotlin arrow-kt 展平嵌套的 Either,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753068/