这是一个相对简单的问题,但是快速的谷歌搜索并没有给我答案。
如何规范地编写序列递归函数?对于列表,您可以使用空列表和头部+尾部模式来进行模式匹配,那么对于序列,有什么等效的方法呢?
由于很少为序列编写递归函数,因此没有标准的方法。
您应该查看Seq模块中各种高阶函数。它们通常已经足够好用,因此您不必自己编写递归函数。
要递归生成序列,序列表达式是一种简单直观的方法:
let rec allFiles dir =
seq { yield! Directory.GetFiles dir
for d in Directory.GetDirectories dir do
yield! allFiles d }
List
或来自F# PowerPack的LazyList进行操作,并将结果转换回序列。无法获取序列的尾部,因为它尚未被计算(并且在理论上可能是无限的),因此您无法将尾部递归地传递到函数中。您只需使用Seq.iter或yield!来遍历序列。
Seq.skip 1
,这将标记在评估项目一次后跳过一个项目。 - Ramon Snir
GetEnumerator()
,但这是命令式的且容易出错的。 - pad