在F#中调用Seq.skip和Seq.take

Moo*_*ght 9 f# sequences

let aBunch = 1000
let offset = 0

let getIt offset =
  MyIEnumerable
  |> Seq.skip aBunch * offset
  |> Seq.take aBunch
  |> Seq.iter ( .. some processing ...)

使用不同的偏移量调用getIt()最终会给我一个"无效操作"异常,其中包含"输入序列元素不足"的附加信息

我尝试理解为什么,因为Seq.Skip和Seq.take都没有根据在线文档FSharp Collections生成异常

版本:(Visual Studio 2010)Beta 1

Joe*_*ler 24

我知道这是一个古老的问题,但万一有人在搜索中遇到这种情况:

如果您最多需要n个项目,可以使用Seq.truncate.如果可用的项目少于n个,则不会抛出异常.


Dus*_*ell 7

如果使用大于序列的值调用,Seq.skip和Seq.take都将抛出此异常.您可以在Seq.fs中查看源代码以了解原因:

let skip count (sequence: seq<_>) =
    { use e = sequence.GetEnumerator() 
      let latest = ref (Unchecked.defaultof<_>)
      let ok = ref false
      for i in 1 .. count do
          if not (e.MoveNext()) then 
              raise <| System.InvalidOperationException "the input sequence had insufficient elements" 
      while e.MoveNext() do
          yield e.Current }

let take count (sequence : seq<'T>)    = 
    if count < 0 then invalidArg "count" "the number of elements to take may not be negative"
    (* Note: don't create or dispose any IEnumerable if n = 0 *)
    if count = 0 then empty else  
    { use e = sequence.GetEnumerator() 
      for i in 0 .. count - 1 do
          if not (e.MoveNext()) then
              raise <| System.InvalidOperationException "the input sequence had insufficient elements" 
          yield e.Current }
Run Code Online (Sandbox Code Playgroud)