Я пытаюсь построить список из последовательности, рекурсивно добавляя первый элемент последовательности в список:
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 ([])
Две проблемы:
. получая переполнение стека, что означает, что мой хвост рецидив уловка
и
. почему код в 100 раз быстрее, когда я ставлю |> Seq.cache
здесь let newS = s |> Seq.skip(1)|> Seq.cache
.
(Обратите внимание, что это всего лишь небольшое упражнение, я понимаю, что вы можете выполнять Seq.toList и т. Д.) *
Большое спасибо
Один из способов это работает (эти две точки все еще остаются немного странными для меня):
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