为什么没有Seq.rev功能?

Tri*_*Gao 6 f#

对我来说这看起来像是一个复杂的问题.为了反转序列(可枚举),必须首先将其转换为列表.这是为什么?

Yot*_*aXP 6

由于您无法向后遍历序列,因此列表是反转序列的理想存储介质.他们建造它们时甚至会有逆转的倾向.

不过,我不知道为什么rev不在Seq模块中.甚至LINQ都有一个Reverse()运营商.幸运的是,它很容易实现.

let rev xs = Seq.fold (fun acc x -> x::acc) [] xs
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用LINQ的运算符.

let rev = System.Linq.Enumerable.Reverse
Run Code Online (Sandbox Code Playgroud)


Joh*_*mer 3

其实现的APISeq本质上有两个功能

  1. 获取下一个项目
  2. 我们是在名单的最后吗

因此,无法检查列表的长度。枚举也可能非常昂贵,因为没有缓存结果,甚至可能导致发生副作用。

而且,序列可能是无限的。

结果,我们没有Seq.rev,我们需要首先使用到另一个序列的变换。

  • Seq.length 怎么样? (2认同)