簡體   English   中英

無法通過繼承函數在Kotlin中創建Ints序列。 說“類型推斷失敗”

[英]Can't create sequence of Ints in Kotlin through succesor function. Says “Type Inference failed”

我正在嘗試通過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())
}

我知道這似乎不是解決此問題的最佳方法,因為已經有增量運算符,並且已經存在生成前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)

核心中定義的公共構造函數S()的參數過多。

我嘗試過的其他事情是將S重寫為

class S: Function<Int> {
    operator fun invoke(x: Int) = x + 1
}

或將generateSequence函數更改為

fun sequenceOfNumbers(start: Int): Sequence<Int> {
    return 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)
}

甚至使S單身人士更好:

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
}

因此,最終您的代碼將類似於您的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM