【问题标题】:return type of Either.fold() in Kotlin arrow libraryKotlin 箭头库中 Either.fold() 的返回类型
【发布时间】:2020-04-24 12:52:48
【问题描述】:

我正在使用箭头库在 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,则 sn-p 返回 String,如果值为 Right,则返回 Int。它如何接受这种语法?

【问题讨论】:

  • 折叠一个类型就像定义这个类型的消除规则。为了消除Either,您需要考虑RightLeft 的情况。由于Either 表示在 Kotlin/Arrow 中可能失败的计算,Left 案例不包含值,因此您需要提供一个默认值,该值必须与 Right 具有相同的类型。

标签: kotlin functional-programming arrow-kt


【解决方案1】:

在这里,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2018-01-25
    • 2022-01-22
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多