Haskell で無限シーケンスが可能であることは知っていますが、それを生成する方法が完全にはわかりません
メソッドが与えられた場合
generate::Integer->Integer
これは整数を取り、シーケンスの次の整数を生成します。これから無限シーケンスを構築するにはどうすればよいですか?
Haskell で無限シーケンスが可能であることは知っていますが、それを生成する方法が完全にはわかりません
メソッドが与えられた場合
generate::Integer->Integer
これは整数を取り、シーケンスの次の整数を生成します。これから無限シーケンスを構築するにはどうすればよいですか?
シーケンスを 1 から開始する場合は、次のとおりです。
iterate generate 1
関数の最初の文字は大文字ではなく小文字であることに注意してください。それ以外の場合は、関数ではなくデータ型になります。
//編集:データ型が大文字で始まるだけでなく、データ コンストラクターまたは型クラスでもあることに気付きましたが、それは重要ではありませんでした。:)
Matajon の回答に追加:iterate
ここで質問する以外の機能を発見する方法は、Hoogle を使用することです。
クエリに対する Hoogle の最初の回答 (a -> a) -> [a]
はiterate
.
いくつかの方法がありますが、その 1 つは次のとおりです。
gen :: (a -> a) -> a -> [a]
gen f s = s : gen f (f s)
この関数は、関数f
といくつかの値を取り、s
を返します。その後、同じと の結果でs
自分自身を呼び出します。デモンストレーション:f
f s
Prelude> :t succ
succ :: (Enum a) => a -> a
Prelude> let gen f s = s : gen f (f s)
Prelude> take 10 $ gen succ 3
[3,4,5,6,7,8,9,10,11,12]
上記の例では、あなたが言及succ
した機能として機能します。generate :: Integer -> Integer
ただしgen
、 type の任意の関数で機能することに注意してa -> a
ください。
編集:実際、Prelude (および Data.List)gen
の関数と同じです。iterate