为什么没有Seq.rev功能?

时间:2013-09-20 04:09:14

标签: f#

对我来说这看起来很复杂。为了反转序列(可枚举),必须首先将其转换为列表。那是为什么?

4 个答案:

答案 0 :(得分:6)

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

我不知道为什么rev首先不在Seq模块中。甚至LINQ也有一个Reverse()运算符。幸运的是,它很容易实现。

let rev xs = Seq.fold (fun acc x -> x::acc) [] xs

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

let rev = System.Linq.Enumerable.Reverse

答案 1 :(得分:4)

为什么没有rev还有其他功能消耗整个序列(lengthsortBygroupBy)?从根本上说,为什么任何函数都是包含在标准库中的不错选择?我猜测它不是一套精确的规则,更多的是打一个“甜蜜点”。例如,它是一个很好的交集:有用的,预期的,高效的,鼓励良好的实践,......有点主观(这就是为什么这个问题最终无法回答)但实际,并且在大多数情况下是直观的。

答案 2 :(得分:3)

实现Seq的API基本上有两个函数

  1. 获取下一个项目
  2. 我们是否在列表末尾
  3. 因此,无法检查列表的长度。枚举也可能非常昂贵,因为没有缓存结果,甚至可能导致副作用发生。

    此外,序列可能是无限的。

    因此,我们没有Seq.rev,我们需要首先使用转换为另一个序列。

答案 3 :(得分:2)

  

当您拥有大型有序数据集但不一定希望使用所有元素时,序列特别有用。单个序列元素仅在需要时计算,因此在不使用所有元素的情况下,序列可以提供比列表更好的性能   http://msdn.microsoft.com/en-us/library/vstudio/dd233209.aspx

let rnd = System.Random()
let nums = seq {
    let rec getNext() = seq {
        yield rnd.Next(100)
        yield! getNext()
    }
    yield! getNext()
}

let len = nums |> Seq.length //nums is an infinite sequence, will not stop