【发布时间】: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,您需要考虑Right和Left的情况。由于Either表示在 Kotlin/Arrow 中可能失败的计算,Left案例不包含值,因此您需要提供一个默认值,该值必须与Right具有相同的类型。
标签: kotlin functional-programming arrow-kt