对于 kotlin 和 arrow-kt 库的理解
For comprehensions with kotlin and arrow-kt library
我使用 arrow-kt 库,我试图在其中使用 Either
和 IO
来理解。
假设我有下一段代码:
IO.monad().binding {
val ans: Either<Error, Data> = someFunctionThatReturnsEitherWrappedInIO().bind()
}
现在,我想在 ans
:
上使用绑定
val data: Data = ans.bind() // My intent
是否可以在第一段代码的范围内完成?
目前我正在尝试在 IO 绑定范围内嵌套一个 Either
绑定,但我不确定这是一个好的做法:
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()
}
背景
首先我要提一下 , that's why you need a Monad transformer, in your case EitherT
是可以帮助你的人。
例子
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
Right(b=3)
我使用 arrow-kt 库,我试图在其中使用 Either
和 IO
来理解。
假设我有下一段代码:
IO.monad().binding {
val ans: Either<Error, Data> = someFunctionThatReturnsEitherWrappedInIO().bind()
}
现在,我想在 ans
:
val data: Data = ans.bind() // My intent
是否可以在第一段代码的范围内完成?
目前我正在尝试在 IO 绑定范围内嵌套一个 Either
绑定,但我不确定这是一个好的做法:
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()
}
背景
首先我要提一下 EitherT
是可以帮助你的人。
例子
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
Right(b=3)