我正在使用函数库arrow-kt (以前称为kategory)进行编程。我使用Either monad聚合api调用的错误或成功信息。我让自己陷入了一种状态(一开始就不应该发生这种情况),在这种状态下,我有一个嵌套的Either单簧管。我试着把结构夷为平地,以获得内心的单元化。文档非常有限,我无法找到一种方法来完成它。
下面是一个嵌套的monad示例,我想将其扁平化:
Either.right(Either.right(Either.left("error")))发布于 2018-02-12 22:50:14
您可以使用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。
干杯!
https://stackoverflow.com/questions/48753068
复制相似问题