Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lambda Can';t通过succesor函数在Kotlin中创建整数序列。说:";“类型推断失败”;_Lambda_Kotlin_Sequence_Peano Numbers - Fatal编程技术网

Lambda Can';t通过succesor函数在Kotlin中创建整数序列。说:";“类型推断失败”;

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

我试图通过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(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
}