Lambda Can';t通过succesor函数在Kotlin中创建整数序列。说:";“类型推断失败”;
我试图通过generateSequence函数从数字0和后续函数S创建一个自然数流/序列 以下是我得到的:Lambda Can';t通过succesor函数在Kotlin中创建整数序列。说:";“类型推断失败”;,lambda,kotlin,sequence,peano-numbers,Lambda,Kotlin,Sequence,Peano Numbers,我试图通过generateSequence函数从数字0和后续函数S创建一个自然数流/序列 以下是我得到的: package core fun sequenceOfNumbers(): Sequence<Int> { return generateSequence(0){x -> S(x)} } class S: (Int) -> Int { override operator fun invoke(x: Int) = x + 1 } fun main
package core
fun sequenceOfNumbers(): Sequence<Int> {
return generateSequence(0){x -> S(x)}
}
class S: (Int) -> Int {
override operator fun invoke(x: Int) = x + 1
}
fun main(args: Array<String>) {
println(sequenceOfNumbers().take(10).toList())
}
包核心
fun sequenceOfNumbers():序列{
返回生成序列(0){x->S(x)}
}
类S:(Int)->Int{
重写运算符fun invoke(x:Int)=x+1
}
趣味主线(args:Array){
println(sequenceOfNumbers().take(10.toList())
}
我知道这似乎不是解决这个问题的最佳方法,因为已经有了增量运算符,并且已经有了生成前n个自然数的快捷方式,但出于其他原因,我希望S成为类或至少是对象
当我编译它时,我得到以下消息:
Type inference failed: Cannot infer type parameter T in
fun <T : Any> generateSequence(
seed: T?,
nextFunction: (T) → T?
) : Sequence<T>
None of the following substitutions
(S?, (S) → S?)
(Int?, (Int) → Int?)
(Any?, (Any) → Any?)
can be applied to
(Int, (Int) → S)
类型推断失败:无法推断中的类型参数T
趣味生成序列(
种子:T?,
下一个函数:(T)→ T
):顺序
以下替代品均不适用
(S),(S)→ )
(Int?,(Int)→ Int?)
(任何?,(任何)→ 有吗?)
适用于
(Int,(Int)→ (S)
及
core中定义的公共构造函数S()的参数太多
我还尝试过将S改写为
class S: Function<Int> {
operator fun invoke(x: Int) = x + 1
}
S类:函数{
运算符调用(x:Int)=x+1
}
或者将generateSequence函数更改为
fun sequenceOfNumbers(start: Int): Sequence<Int> {
return generateSequence(seed = start, nextFunction = (x: Int) -> S(x))
}
编号的有趣序列(开始:Int):序列{
返回generateSequence(seed=start,nextFunction=(x:Int)->S(x))
}
这也没用。最后一个函数得到编译消息“意外类型规范”和“意外标记(使用“;”分隔同一行上的表达式)”
有没有办法解决这个问题,使
println
函数打印出前10个自然数,并且仍然使用后续类?您的代码中的问题是,您实际上调用了S
的构造函数,而不是invoke()
。您应该更改为以下内容以使其正常工作:
return generateSequence(0){x -> S()(x)}
当然,如果您将S
存储在局部变量中,并在序列生成器中重用它,效果会更好:
fun sequenceOfNumbers(): Sequence<Int> {
val s = S()
return generateSequence(0){x -> s(x)} //generateSequence(0, s::invoke)
}
因此,最终您的代码将与示例中的代码类似
fun sequenceOfNumbers(): Sequence<Int> {
return generateSequence(0) { x -> S(x)} //generateSequence(0, S::invoke)
}
object S: (Int) -> Int {
override operator fun invoke(x: Int) = x + 1
}