列挙子を破棄する必要があるため、末尾呼び出しが最適化されていない私の試みは次のとおりです。
let Group func seed (items : seq<'t>) =
let rec some (i : IEnumerator<'t>) state = seq {
try
if i.MoveNext()
then
let newstate, iscomplete = func (i.Current) state
if iscomplete
then
yield newstate
yield! some i newstate
else
yield state
finally
i.Dispose() }
some (items.GetEnumerator ()) seed
そして、ここに使用例があります:
let buffer maxBufferSize items =
Group (fun item state ->
let newstate = [ item ] |> List.append state
if newstate.Length >= maxBufferSize
then (newstate, true)
else (newstate, false)) List.empty items
列挙子の使用を避けることができれば(つまりSeq.head AND Seq.tail
)、それを機能させることはできますが、それがなければSeq.tail
途方に暮れます。私はこれを一般的なシーケンスで機能させることを本当に望んでいます。
そして参考までに、このコードは現在の状態では機能しないことを知っています。これは、列挙子を複数回破棄することになるためです。