Kotlin - 如何递归调用lambda函数

时间:2017-01-03 19:29:05

标签: recursion lambda kotlin

我正在尝试从Kotlin中的here重新实现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
}
当我尝试运行代码时,IntelliJ给了我以下错误:

Error:(40, 19) Kotlin: Unresolved reference: myfunc

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

1 个答案:

答案 0 :(得分: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
}

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

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