首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Arrow-kt中从嵌套的三体中生成错误?

如何在Arrow-kt中从嵌套的三体中生成错误?
EN

Stack Overflow用户
提问于 2022-02-05 23:19:13
回答 1查看 422关注 0票数 1

我有一些代码如下所示:

代码语言:javascript
复制
data class MyStrings(val a: String, val b: String)

sealed class Error {
    object SpecificError0 : Error()
    object SpecificError1 : Error()
    object SpecificError2 : Error()
}

fun either2(): Either<Error, String> =
Either.catch { throw RuntimeException("Either 2") }.mapLeft { Error.SpecificError2 }

fun either4(): Either<Error, MyStrings> =
Either.catch {

    MyStrings(
        a = "Hello",
        b = either2().getOrElse { "" }
    )

}.mapLeft { Error.SpecificError2 }

这将吞噬来自either2()的错误。

如果可能的话,我正在设法从either2中抛出这个错误。

我知道我可以这样做:

代码语言:javascript
复制
fun either5(): Either<Error, MyStrings> =
either2()
    .flatMap {
        Either.Right(
            MyStrings(
                a = "Hello",
                b = it
            )
        )
    }

但在我需要它之前叫它似乎很奇怪!

对于如何更改either4(),有什么想法吗?如果这是一个n00b问题,我很抱歉,但是我仍然试图把我的注意力集中在函数式编程和Arrow上。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-06 09:51:56

昆贝拉,

在最后一个片段中,您并不是在需要它之前真正调用它,但是在语义上它确实是这样的。因为MyStrings依赖于either2()的结果,但是我们可以用更好的方式重写它,这样可以扩展得更好,而不需要嵌套回调。

您可以通过使用Arrow的计算块来改进这些代码段,这样可以安全地从Either中提取值。

代码语言:javascript
复制
fun either5(): Either<Error, MyStrings> = either.eager {
  MyStrings(a = "Hello", b = either2().bind())
}

这里发生的情况是,当您调用bind时,它将返回Either.Right的值,或者它将立即返回either2()作为either.eager结果返回的Either.Left

还有一个either计算块的either变体,您可以将其直接用作

代码语言:javascript
复制
suspend fun either6(): Either<Error, MyString> = either {
  delay(100)
  MyStrings(a = "Hello", b = either2().bind())
}

我希望这能完全回答你的问题!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71002964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档