【问题标题】:Kotlin arrow-kt Flatten nested EitherKotlin arrow-kt 展平嵌套的 Either
【发布时间】:2019-04-01 18:54:30
【问题描述】:

我正在使用函数库arrow-kt(以前称为kategory)进行编程。我正在使用 Either monad 来聚合 api 调用的错误或成功信息。我让自己进入了一个状态(这首先不应该发生),其中我有一个嵌套 Either monads。我正在尝试使结构变平以获取内部单子。文档非常有限,我找不到方法。

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

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

【问题讨论】:

  • 快速响应:要么有一个 flatMap 方法,但你永远不应该创建嵌套。使用 fold、flatMap、flatMapLeft 来确保你最终只达到一层深度。如果您有代码示例,我可能会提供更多帮助。
  • flatMap 正在丢弃 left 值。我想保留它们(类似于fold 的集合)。关于代码,我将不得不粘贴相当数量的代码......我会尽快完成。
  • 是不是你应该得到Either.left()作为返回值,什么都不应该计算,因为我认为你有一个错误

标签: functional-programming kotlin


【解决方案1】:

你可以用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 的 SO 更具互动性,还可以随意使用我们的聊天频道。

干杯!

【讨论】:

  • 感谢您的快速回复!我会暂时使用flatten,稍后再查看Validated
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 2019-07-17
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多