我正在学习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)
}
}
但是我认为这不是应该这样做,因为结果是AnyFold kotlin.Unit
。
现在我正在寻找一种不同的方法。是否可以通过将任何功能映射到fold函数来创建任何功能?想法很受欢迎。
答案 0 :(得分:0)
使用符号:
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
}