Kotlin - 如何递归调用lambda函数

M K*_*ane 4 recursion lambda kotlin

我试图重新从实现linrec功能这里在科特林.以下是Kotlin目前的情况:

fun <A, B> linrec(indivisible: (List<A>) -> Boolean,
                  value: (List<A>) -> B,
                  divide: (List<A>) -> List<List<A>>,
                  combine: (A, B) -> B
                  ) : (List<A>) -> B {
  val myfunc: (List<A>) -> B = { input ->
    if (indivisible(input)) {
      value(input)           
    } else {
      val split = divide(input)
      val left = split[0][0]
      val right = myfunc(split[1])  // Error
      combine(left, right)   
    }
  }
  return myfunc
}
Run Code Online (Sandbox Code Playgroud)

当我尝试运行代码时,IntelliJ给出了以下错误:

Error:(40, 19) Kotlin: Unresolved reference: myfunc
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何自己调用lambda函数?

vod*_*dan 5

你不从内部调用lambda("匿名函数").这就是函数的用途:

fun <A, B> linrec(indivisible: (List<A>) -> Boolean,
                  value: (List<A>) -> B,
                  divide: (List<A>) -> List<List<A>>,
                  combine: (A, A) -> B
                  ) : (List<A>) -> B {

  fun myfunc(input: List<A>): B {     // rearranged things here
    return if (indivisible(input)) {  // added `return`
      value(input)           
    } else {
      val split = divide(input)
      val left = split[0][0]
      val right = myfunc(split[1])
      combine(left, right)            // *   
    }
  }
  return ::myfunc
}
Run Code Online (Sandbox Code Playgroud)

现在这正是您编写的代码,但它不能编译.在我用*kotlinc 标记的那条线上说Type mismatch: inferred type is B but A was expected.

PS我不知道代码是做什么的,所以我只修复了你问的编译错误.