Kotlin arrow-kt Flatten nested Aither

Max*_*axG 4 functional-programming kotlin

我正在使用函数库arrow-kt(以前称为kategory)进行编程.我正在使用Eithermonad来聚合api调用的错误或成功信息.我让自己进入一个状态(这不应该首先发生)我有一个nestet Eithermonad.我试图压扁结构以获得内部单子.文档非常有限,我找不到办法.

这是我想要展平的嵌套Either monad的示例:

Either.right(Either.right(Either.left("error")))
Run Code Online (Sandbox Code Playgroud)

Raú*_*nez 13

你可以用以下方法压扁这样的结构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))
Run Code Online (Sandbox Code Playgroud)

要不就 flatMap

import arrow.core.*
import arrow.typeclasses.*

val result = Either.right(Either.right(Either.left("error")))
result.flatMap { it.flatMap { it } }
// Left(a=error)
Run Code Online (Sandbox Code Playgroud)

你最终得到这样的嵌套结构的事实可能意味着你没有在你的程序中的某个点使用正确的数据类型或错误的抽象,因为这是一种无用的值.

如果您希望保留评论中指示的左侧值,我认为更合适的数据类型将Validated允许错误累积,如此处所示http://arrow-kt.io/docs/datatypes/validated/

或者,Either#fold可以帮助您考虑这两种情况,然后将其合并为您想要的任何价值.

我假设你已经遇到了大部分这些东西都被解释过的地方但是以防一些有用的链接可以帮助你用Arrow模型化

此外,如果您需要与维护人员和其他贡献者之间的互动体验,我们可以通过我们的聊天频道自由摇摆,我们经常帮助各级人员学习FP和Arrow.

干杯!