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
Recursion Kotlin:高阶函数递归、迭代和带折叠_Recursion_Kotlin_Iteration_Higher Order Functions - Fatal编程技术网

Recursion Kotlin:高阶函数递归、迭代和带折叠

Recursion Kotlin:高阶函数递归、迭代和带折叠,recursion,kotlin,iteration,higher-order-functions,Recursion,Kotlin,Iteration,Higher Order Functions,我正在学习Kotlin和函数式编程。我必须为一个密封的类实现自己的函数。其中一个函数应该以三种不同的方式创建:递归、迭代和使用fold函数。我选择了any()函数 经过大量研究,我唯一的想法是创建tailrec函数,并在函数内部使用fold: fun <T> anyFold (list: MyList<T>, p: (T) -> Boolean) { tailrec fun <R> fold (list : MyList<T>, init:

我正在学习Kotlin和函数式编程。我必须为一个密封的类实现自己的函数。其中一个函数应该以三种不同的方式创建:递归、迭代和使用fold函数。我选择了
any()
函数

经过大量研究,我唯一的想法是创建tailrec函数,并在函数内部使用fold:

fun <T> anyFold (list: MyList<T>, p: (T) -> Boolean)  {
tailrec fun <R> fold (list : MyList<T>, init: R, transform: (R, T) -> R) : Boolean {
    when (list) {
        is MyList.Node -> fold(list.tail, transform(init,list.head),transform)
        is MyList.Nil -> init
    }
    return fold(list, init, transform)

}
fun anyFold(列表:MyList,p:(T)->Boolean){
tailrec fun fold(列表:MyList,init:R,transform:(R,T)->R):布尔{
时间(列表){
是MyList.Node->fold(list.tail,transform(init,list.head),transform)
是MyList.Nil->init
}
返回折叠(列表、初始化、转换)
}
}

但我认为这不是应该做的,因为结果是
无论如何kotlin.Unit

现在我正在寻找一种不同的方法。有没有办法通过将any函数映射到fold函数来创建any函数?非常欢迎您的想法。

使用您的符号:

fun <T> anyFold(list: List<T>, p: (T) -> Boolean): Boolean =
    list.fold(false, { acc, element -> acc || p(element) })


fun main() {
    println(  anyFold( listOf(1,2,3,4,5)) {it < 5 }) // true
    println(  anyFold( listOf(1,2,3,4,5)) {it > 5 }) // false
}
fun anyFold(list:list,p:(T)->Boolean):Boolean=
折叠(false,{acc,element->acc|p(element)})
主要内容(){
println(anyFold(listOf(1,2,3,4,5)){it<5}//true
println(anyFold(listOf(1,2,3,4,5)){it>5}//false
}

您需要的是确定要传递的内容,而不是
init
transform
,因此它将是
anyFold(list:MyList,p:(T)->Boolean)=fold(list,?,p:?)
。您的版本只定义
fold
,不使用它。确定。现在我得到了:fun anyfold(list:MyList,p:(T)->Boolean)=折叠(list,p,?)。p是init。但是转换应该传递什么呢?不,
init
不应该是
p