Kotlin箭头库中的返回类型为Ear.fold()



我正在Kotlin学习使用箭头库的函数编程,我遇到了以下两种类型的fold函数的奇怪行为(至少对我来说(。

import arrow.core.*
import arrow.syntax.function.pipe
object UserService {
fun findAge(user: String): Either<String, Option<Int>> {
return Either.Right(Some(1))
}
}
fun main(args: Array<String>) {
val anakinAge: Either<String, Option<Int>> = UserService.findAge("Anakin")
anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})}) pipe ::println
}

根据箭头折叠函数语法为

inline fun <C> fold(ifLeft: (A) -> C, ifRight: (B) -> C): C

如果值为Left,则执行ifLeft函数并返回类型C如果值为right,则执行ifRight并返回相同类型的值C,但在我上面的代码片段中,如果值为Left,则返回String,如果值是right,则返回Int。它如何接受这种语法?

在这里,fold找到类型StringInt的第一个公共父级,即Any。在Kotlin中,与Java不同的是,它没有基本类型,都是对象。

因此,如果您将结果用于任何不接受Any的函数,它就会失败。

fun check(s: String): String = s
van a = anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})})
check(a)

得到CCD_ 6。

相关内容

  • 没有找到相关文章

最新更新