1

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

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如果它是正确的则执行 ifRight 并返回具有相同类型C的值,但在我上面的代码片段中,如果值为 Left 则返回 String ,如果值为 Right 则返回 Int . 它如何接受这种语法?

4

1 回答 1

4

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

所以,如果你将结果用于任何不接受的函数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

于 2020-04-24T13:06:33.400 回答