Kotlin箭头库中Either.fold()的返回类型。

我正在Kotlin中学习函数式编程,使用Array库,我遇到了以下奇怪的行为的折叠函数的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 函数并返回类型 C 如果它是正确的,它会执行ifRight并返回一个相同类型的值。C但在我上面的代码片段中,如果值是左,则返回String,如果值是右,则返回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.

给TA打赏
共{{data.count}}人
人已打赏
未分类

在DT中,两个可编辑的列互相计算。

2022-9-9 4:02:16

未分类

在ngIf中加载API中的URL,并再次使用该值。

2022-9-9 4:02:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索