, Seq, , .
module Seq =
let initInfiniteBig =
seq {
let i = ref 0I
while true do
yield !i
i := !i + 1I
}
let ten = Seq.initInfiniteBig |> Seq.take 10
Update
:
let initInfiniteBig =
seq {
let i = ref 0I
while true do
yield !i
i := !i + 1I
}
let initInfiniteBig2 =
seq {
let i = ref 0I
while true do
yield i.contents
i.contents <- i.contents + 1I
}
let initInfiniteBig3 =
let rec loop i =
seq {
yield i
yield! loop (i + 1I)
}
loop 0I
let initInfiniteBig4 = Seq.unfold (fun n -> Some(n, n + 1I)) 0I
let range s = s |> Seq.take 100000000 |> Seq.length |> ignore
range initInfiniteBig
range initInfiniteBig2
range initInfiniteBig3
range initInfiniteBig4
2
There is a common range function here, for example Stephen's, but without startand skip.
let inline infiniteRange() : seq<'a> =
let zero : 'a = LanguagePrimitives.GenericZero
let one : 'a = LanguagePrimitives.GenericOne
seq {
let n = ref zero
while true do
yield !n
n := !n + one
}
Here's the signature:
unit -> seq< ^a>
when ^a : (static member get_Zero : -> ^a) and
^a : (static member get_One : -> ^a) and
^a : (static member ( + ) : ^a * ^a -> ^a)
And the standard:
range (infiniteRange() : seq<bigint>) //Real: 00:00:30.042, CPU: 00:00:29.952, GC gen0: 0, gen1: 0, gen2: 0
source
share