Ven*_*cat 1 functional-programming kotlin arrow-kt
我正在使用箭头库在 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
}
Run Code Online (Sandbox Code Playgroud)
根据箭头折叠函数语法是
inline fun <C> fold(ifLeft: (A) -> C, ifRight: (B) -> C): C
Run Code Online (Sandbox Code Playgroud)
如果值为 Left,则执行ifLeft函数并返回类型C如果为 right,则执行 ifRight 并返回具有相同类型C的值,但在上面的代码片段中,如果值为 Left,则返回 String;如果值为 Right,则返回 Int 。它如何接受这种语法?
在这里,fold找到类型String和的第一个公共父代Int,即Any。与 Java 不同,Kotlin 中没有基本类型,都是对象。
因此,如果您将结果用于任何不采用 的函数Any,则会失败。
fun check(s: String): String = s
van a = anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})})
check(a)
Run Code Online (Sandbox Code Playgroud)
产量Type mismatch: inferred type is Any but String was expected.
| 归档时间: |
|
| 查看次数: |
4542 次 |
| 最近记录: |