这是我的尝试,它没有优化尾调用,因为我需要处理枚举器:
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
我会不知所措。我真的希望用通用序列来完成这项工作..
仅供参考,我知道这段代码在当前状态下无法工作,因为我最终会多次处理枚举器。