【发布时间】:2014-01-01 00:27:13
【问题描述】:
我需要一个在 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 返回一个双精度值。再说一遍 - 还有什么比我自己重新实现计算平方根的逻辑更好的方法吗?
【问题讨论】:
标签: optimization f# inline automatic-generalization