Recursion Kotlin:高阶函数递归、迭代和带折叠
我正在学习Kotlin和函数式编程。我必须为一个密封的类实现自己的函数。其中一个函数应该以三种不同的方式创建:递归、迭代和使用fold函数。我选择了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:
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
。