首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与kotlin和arrow-kt图书馆的理解

与kotlin和arrow-kt图书馆的理解
EN

Stack Overflow用户
提问于 2018-12-12 15:58:59
回答 1查看 1.7K关注 0票数 6

我使用箭头-kt库,并且我试图在相同的范围内使用EitherIO来理解。

假设我有下一段代码:

代码语言:javascript
复制
IO.monad().binding {
    val ans: Either<Error, Data> = someFunctionThatReturnsEitherWrappedInIO().bind()
}

现在,我想在ans上使用绑定

代码语言:javascript
复制
val data: Data = ans.bind() // My intent

是否有可能在第一段代码的范围内执行此操作?

目前,我正试图在IO绑定的范围内嵌套一个Either绑定,但我不确定这是一个好做法:

代码语言:javascript
复制
IO.monad().binding {
    val ans: Either<Error, Data> = someFunctionThatReturnsEitherWrappedInIO().bind()
    val ansB: Either<Error, OtherData> = someOtherFunctionThatReturnsEitherWrappedInIO().bind()

    val newData: Either<Any, NewData> = Either.monad<Any>().binding {
        val data: Data = ans.bind()
        val otherData: OtherData = ansB.bind()
        NewData(data.a, otherData.lala)
    }.fix()
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-12 17:02:09

背景

首先,我应该提到单曲不作曲,这就是为什么您需要一个Monad变压器,在您的例子中,EitherT是能够帮助您的人。

示例

代码语言:javascript
复制
object Error

fun one() = IO { Right(1) }
fun two() = IO { Right("2") }
fun toInt(str: String) = IO { Try { str.toInt() }.toEither { Error } }

val result: IO<Either<Error, Int>> =
    EitherT.monad<ForIO, Error>(IO.monad()).binding {
        val oneInt = EitherT(one()).bind()
        val twoString = EitherT(two()).bind()
        val twoInt = EitherT(toInt(twoString)).bind()
        oneInt + twoInt
    }.value().fix()

println(result.unsafeRunSync()) // Just for demonstration, don't do this ever

右(b=3)

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

https://stackoverflow.com/questions/53746818

复制
相关文章

相似问题

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