为什么Seq.isEmpty说不够元素?

时间:2016-01-23 19:25:38

标签: f#

当我鼠标移动时,

nums确实是int的seq。知道发生了什么事吗? 此功能行旨在等同于C#的DefaultIfEmpty Linq功能。

一般的想法是采用以空格分隔的字符串行,并写出哪些字符串发生次数。

enter image description here

代码:

{{1}}

示例输入:
3
9 2
4 5 2 5 4 3 1 3 4

1 个答案:

答案 0 :(得分:9)

因此,F#中的序列使用延迟评估。这意味着当您使用mapwheretake等功能时,不会立即评估结果。

仅在实际枚举序列时评估结果。当您调用Seq.isEmpty时,您会触发对MoveNext()的调用,这会导致对结果序列的第一个元素进行求值 - 在您的情况下,这将导致对大量函数进行求值。

在这种情况下,InvalidOperationException实际上是由Seq.take触发的,如果序列没有足够的元素,它将抛出。这可能会让您感到惊讶,来自C#,其中Enumerable.Take将占用所请求的元素数量,但如果到达序列末尾则可能会减少。

如果您希望在F#中使用此行为,则需要将Seq.take替换为Seq.truncate