是什么导致F#序列重新枚举?

是什么导致F#序列重新枚举?,f#,sequences,F#,Sequences,我有一个解析器,它实际上是一组对lexer标记序列进行操作的递归函数 我遇到的问题是,在递归函数调用时,序列似乎从一开始就重新启动。给出函数Parse let restricted = Seq.take_while token_search tokens let compiled_nodes = Seq.fold (fun list (next: Lexer.Token) -> list @ parse_token this restricted next) [] rest

我有一个解析器,它实际上是一组对lexer标记序列进行操作的递归函数

我遇到的问题是,在递归函数调用时,序列似乎从一开始就重新启动。给出函数
Parse

    let restricted = Seq.take_while token_search tokens
    let compiled_nodes = Seq.fold (fun list (next: Lexer.Token) -> list @ parse_token this restricted next) [] restricted
函数
parse_token
可能导致调用
parse

但是,当发生这种情况时,参数
标记
最终位于序列的开头

关于如何将序列保持在需要的位置有什么想法吗


tia

我想你可能需要发布一个稍微大一点的片段,因为我不太明白你的意思

也就是说,一个序列(IEnumerable)就是一个序列,每次你对(foreach)或Seq执行操作时,它都会“重新迭代”该序列。我不清楚您想要做什么,以及您期望发生什么,但对于解析来说,将“令牌”表示为序列可能是“错误的”,因为您通常将令牌划分为已消费/已提交区域和前瞻区域


另外请注意,您通常不希望“迭代序列”产生副作用。

您说得很对。我意识到在我发布了这个问题之后,我意识到了这个问题是什么。我试图构建一个共享IEnumerator的等价物,这是错误的方法。我最终在列表上构建了它,传递了未使用的剩余部分。哈,我只是做了同样的事情。谢谢你问我这个问题,这可能帮我省了几个小时的麻烦。我也在重写解析器,但我使用的是字节数组缓冲区序列