我正在尝试从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函数?
答案 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。我不知道代码是做什么的,所以我只修复了你所问的编译错误。