return Kotlin 箭头库中的 Either.fold() 类型

return type of Either.fold() in Kotlin arrow library

我正在使用箭头库在 Kotlin 中学习函数式编程,我遇到了 Either 类型折叠函数的以下奇怪行为(至少对我而言)。

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 函数并 returns 键入 C 如果正确则执行 ifRight 和 returns 具有相同类型 C 的值,但在我上面的代码片段中,如果值为 Left 则返回 String,如果值为 Left 则返回 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)

产量 Type mismatch: inferred type is Any but String was expected.