Recursion F中序列的递归函数#

Recursion F中序列的递归函数#,recursion,f#,sequence,Recursion,F#,Sequence,这是一个相当琐碎的问题,但谷歌快速搜索并没有给我答案 为序列编写递归函数的标准方法是什么?对于使用空列表和head+tail模式进行模式匹配的列表,序列的等效值是什么?无法获取序列的尾部,因为它尚未计算(理论上可能是无限的),因此不能将尾部递归传递到函数中。您只需使用Seq.iter或yield!查看序列。由于很少为序列编写递归函数,因此没有标准方法 您应该查看中的各种高阶函数。它们通常是足够的,因此您不必自己编写递归函数 要递归生成序列,序列表达式是一种简单直观的方法: let rec all

这是一个相当琐碎的问题,但谷歌快速搜索并没有给我答案


为序列编写递归函数的标准方法是什么?对于使用空列表和head+tail模式进行模式匹配的列表,序列的等效值是什么?

无法获取序列的尾部,因为它尚未计算(理论上可能是无限的),因此不能将尾部递归传递到函数中。您只需使用Seq.iter或yield!查看序列。

由于很少为序列编写递归函数,因此没有标准方法

您应该查看中的各种高阶函数。它们通常是足够的,因此您不必自己编写递归函数

要递归生成序列,序列表达式是一种简单直观的方法:

let rec allFiles dir =
    seq { yield! Directory.GetFiles dir
          for d in Directory.GetDirectories dir do
            yield! allFiles d }

如果您必须分解一个序列并递归地操作它,那么您就做错了。您应该操作
列表
或,然后将结果转换回序列。

那么让我问一个更具体的问题:)是的,那太好了。在没有具体细节的情况下很难回答这个问题。在这里被问到:无论如何,我很惊讶没有简单的方法在序列上获得(不可变)迭代器。在那里回答了你的问题。您可以始终使用
GetEnumerator()
,但这是必需的且容易出错。您可以执行
Seq.skip 1
,该操作将标记一旦对项目进行评估,将跳过单个项目。