シーケンスの最初の要素をリストに再帰的に追加することにより、シーケンスからリストを構築しようとしています:
open System
let s = seq[for i in 2..4350 -> i,2*i]
let rec copy s res =
if (s|>Seq.isEmpty) then
res
else
let (a,b) = s |> Seq.head
Console.WriteLine(string a)
let newS = s |> Seq.skip(1)|> Seq.cache
let newRes = List.append res ([(a,b)])
copy newS newRes
copy s ([])
2 つの問題:
. スタック オーバーフローが発生しました。これは、テール リカッシブな策略がひどい
と
. |> Seq.cache
ここ に置くと、コードが 100 倍高速になるのはなぜですかlet newS = s |> Seq.skip(1)|> Seq.cache
。
(これはほんの少しの演習であることに注意してください。Seq.toList などを実行できることは理解しています。)
どうもありがとう
機能する1つの方法は次のとおりです(2つのポイントはまだ私には少し奇妙です):
let toList (s:seq<_>) =
let rec copyRev res (enum:Collections.Generic.IEnumerator<_*_>) =
let somethingLeft = enum.MoveNext()
if not(somethingLeft) then
res
else
let curr = enum.Current
Console.WriteLine(string curr)
let newRes = curr::res
copyRev newRes enum
let enumerator = s.GetEnumerator()
(copyRev ([]) (enumerator)) |>List.rev