Kotlin arrow-kt Flatten nested Aither

时间:2018-02-12 18:24:00

标签: functional-programming kotlin

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

这是我想要展平的嵌套Either monad的一个例子:

Either.right(Either.right(Either.left("error")))

1 个答案:

答案 0 :(得分:11)

您可以使用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可以帮助您考虑这两种情况,然后将其合并为您想要的任何值。

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

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

干杯!