2

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 個の自然数を出力し、引き続き後続クラスを使用するように、これを解決する方法はありますか?

4

1 に答える 1