我需要一个在 F# 中产生素数的函数。我找到了这个:
let primesSeq =
let rec nextPrime n p primes =
if primes |> Map.containsKey n then
nextPrime (n + p) p primes
else
primes.Add(n, p)
let rec prime n primes =
seq {
if primes |> Map.containsKey n then
let p = primes.Item n
yield! prime (n + 1) (nextPrime (n + p) p (primes.Remove n))
else
yield n
yield! prime (n + 1) (primes.Add(n * n, n))
}
prime 2 Map.empty
这很好用,但有时我也需要使用 int64/BigInts。有没有比提供像这样的其他序列更聪明的方法来重用这段代码:
let primesSeq64 = Seq.map int64 primesSeq
let primesBigInts = Seq.map (fun (x : int) -> BigInteger(x)) primesSeq
我听说过使用“inline”和“LanguagePrimitives”修改代码,但我发现的只是与函数有关,而我的问题与一个值有关。
此外 - 我想要一个可以处理整数类型并计算平方根下限的函数。
let inline sqRoot arg = double >> Math.Sqrt >> ... ?
但我看不到返回与“arg”相同类型的方法,因为 Math.Sqrt 返回一个双精度值。再说一遍 - 有什么比我自己重新实现计算平方根的逻辑更好的方法吗?