F#中用于序列的递归函数

5

这是一个相对简单的问题,但是快速的谷歌搜索并没有给我答案。

如何规范地编写序列递归函数?对于列表,您可以使用空列表和头部+尾部模式来进行模式匹配,那么对于序列,有什么等效的方法呢?

2个回答

8

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

您应该查看Seq模块中各种高阶函数。它们通常已经足够好用,因此您不必自己编写递归函数。

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

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

如果您必须递归地拆分序列并进行操作,则做法是错误的。您应该使用List来自F# PowerPack的LazyList进行操作,并将结果转换回序列。

那让我问一个更具体的问题吧 :) - Grzenio
是的,那将会很好。没有具体细节的情况下回答这个问题是困难的。 - pad
在这里提问:https://dev59.com/RmbWa4cB1Zd3GeqPSgiC - Grzenio
无论如何,我相当惊讶的是没有简单的方法来获取序列上(不可变)迭代器。 - Grzenio
1
在那里回答了你的问题。你总是可以使用 GetEnumerator(),但这是命令式的且容易出错的。 - pad

0

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


1
你可以使用 Seq.skip 1,这将标记在评估项目一次后跳过一个项目。 - Ramon Snir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接