Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin arrow库中.fold()的返回类型_Kotlin_Functional Programming_Arrow Kt - Fatal编程技术网

Kotlin arrow库中.fold()的返回类型

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库学习Kotlin中的函数编程,下面我遇到了两种类型的折叠函数的奇怪行为(至少对我来说是这样)

导入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
具有相同的类型。