Kotlin arrow库中.fold()的返回类型
我正在使用arrow库学习Kotlin中的函数编程,下面我遇到了两种类型的折叠函数的奇怪行为(至少对我来说是这样)Kotlin arrow库中.fold()的返回类型,kotlin,functional-programming,arrow-kt,Kotlin,Functional Programming,Arrow Kt,我正在使用arrow库学习Kotlin中的函数编程,下面我遇到了两种类型的折叠函数的奇怪行为(至少对我来说是这样) 导入arrow.core* 导入arrow.syntax.function.pipe 对象用户服务{ fun findAge(用户:字符串):或者{ 返回其中一个。对(一些(1)) } } 趣味主线(args:Array){ val anakinAge:or=UserService.findAge(“Anakin”) anakinAge.fold({itLeft->itLeft.t
导入arrow.core*
导入arrow.syntax.function.pipe
对象用户服务{
fun findAge(用户:字符串):或者{
返回其中一个。对(一些(1))
}
}
趣味主线(args:Array){
val anakinAge:or=UserService.findAge(“Anakin”)
anakinAge.fold({itLeft->itLeft.toUpperCase()},{itRight->itRight.fold({1},{it}}})管道::println
}
如箭头所示,折叠函数语法为
inline fun <C> fold(ifLeft: (A) -> C, ifRight: (B) -> C): C
inline fun fold(ifLeft:(A)->C,ifRight:(B)->C):C
如果值为Left,则执行ifLeft函数并返回类型C,如果值为right,则执行ifRight并返回类型相同的值C,但在我上面的代码段中,如果值为Left,则返回String,如果值为right,则返回Int。它是如何接受这种语法的?在这里,
fold
找到类型String
和Int
的第一个公共父级,即Any
。在Kotlin中,与Java不同,它没有基本类型,而是所有对象
因此,如果将结果用于任何不接受any
的函数,则该函数将失败
fun check(s: String): String = s
van a = anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})})
check(a)
产生
类型不匹配:推断的类型是除字符串之外的任何类型在这里,fold
查找类型String
和Int
的第一个公共父级,即Any
。在Kotlin中,与Java不同,它没有基本类型,而是所有对象
因此,如果将结果用于任何不接受any
的函数,则该函数将失败
fun check(s: String): String = s
van a = anakinAge.fold({itLeft -> itLeft.toUpperCase()},{itRight -> itRight.fold({ 1 }, {it})})
check(a)
产生类型不匹配:推断的类型是Any,但字符串是预期的
折叠类型就像定义此类型的消除规则一样。为了消除<代码> < <代码> >,您需要考虑<代码>右<代码> >代码>左边<代码>案例。由于或表示Kotlin/Arrow中可能失败的计算,Left
案例不包含值,因此您需要提供一个默认值,该值必须与Right
具有相同的类型。折叠类型类似于定义此类型的消除规则。为了消除<代码> < <代码> >,您需要考虑<代码>右<代码> >代码>左边<代码>案例。由于或表示Kotlin/箭头中可能失败的计算,Left
案例不包含值,因此您需要提供一个默认值,该值必须与Right
具有相同的类型。