functional-programming - Kotlin arrow-kt 展平嵌套的 Either

标签 functional-programming kotlin

我正在使用函数库 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 进行建模
  • 文档:http://arrow-kt.io/docs/datatypes/either/
  • 视频:https://www.youtube.com/watch?v=q6HpChSq-xc
  • 带箭头的 FP 错误处理:http://arrow-kt.io/docs/patterns/error_handling/

  • 此外,如果您需要与维护人员和其他贡献者之间的互动体验,比我们经常帮助各个级别的人学习 FP 和 Arrow 的方式更具互动性,请随意使用我们的聊天 channel 。
  • git :https://gitter.im/arrow-kt/Lobby
  • 松弛:https://kotlinlang.slack.com/messages/C5UPMM0A0

  • 干杯!

    关于functional-programming - Kotlin arrow-kt 展平嵌套的 Either,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753068/

    相关文章:

    scala - 不清楚 "Checked exception"中的 "functional programming in Scala"解释

    Android Kotlin Retrofit Post 请求输入的数据未发送

    java - Java/Kotlin Android 应用程序的通用应用程序状态架构?

    generics - Kotlin:是否可以拥有依赖于实现泛型类型的常量属性?

    clojure - 在Clojure中,为什么包含URL的 block 注释会引发异常?

    haskell - 如何让非法值(value)观无法代表?

    android - 房间 - 使用@get :Query instead @Query

    java - 在 ObjectBox 中级联删除或对此进行模拟

    java - 函数式编程初学者 : Currying in Java

    javascript - 与标题进行分组/求和