I’m trying to use Seq.cache with a function that I made that returns a sequence of primes up to a number N excluding the number 1. I’m having trouble figuring out how to keep the cached sequence in scope but still use it in my definition.
let rec primesNot1 n =
{2 .. n}
|> Seq.filter (fun i ->
(primesNot1 (i / 2) |> Seq.for_all (fun o -> i % o <> 0)))
|> Seq.append {2 .. 2}
|> Seq.cache
Any ideas of how I could use Seq.cache to make this faster? Currently it keeps dropping from scope and is only slowing down performance.
Seq.cachecaches anIEnumerable<T>instance so that each item in the sequence is only calculated once. In your case, though, you’re caching the sequence returned by a function, and each time you call the function you get a new cached sequence, which doesn’t do you any good. I don’t think caching is really the right approach to your problem as you’ve outlined it; instead you should probably look into memoization.If instead of defining a function giving the primes less than
nyou want to define an infinite enumerable sequence of primes, then caching makes more sense. That would look more like this:I haven’t compared the performance of this method compared to yours.