Clojure中BigInt与BigInteger的用例

时间:2013-08-02 16:29:25

标签: clojure

我正在寻找有关何时在Clojure中使用Clojure BigInt与Java BigInteger的指导。两者都工作正常,我假设使用BigInt的主要原因是利用+=等运算符,这些运算符必须通过Java实例方法.add访问例如,.equals。但是很少有运营商,例如isProbablePrime,我只能从BigInteger访问。

从BigInt转换到BigInteger似乎很容易,反之亦然,但两者的存在使我的用例不明确。我的下意识反应只是在没有明确标准的情况下坚持使用BigInteger,因为一些建议的用法似乎不起作用。来自clojuredocs here

user=> (def x (bigint 97))
user=> (.isProbablePrime x 1)
IllegalArgumentException No matching method found: isProbablePrime for class     
clojure.lang.BigInt  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)

1 个答案:

答案 0 :(得分:24)

C. Emerick等人的“Clojure Programming”。 al。,p.428,有一个侧栏主题,“当Java已经在BigInteger中提供一个时,为什么Clojure有自己的BigInt类?”

他们注意到两个理由更喜欢BigInt到Java的BigInteger。首先,后者的.hashCode实现与Long的实现不一致(每种类型中表示的相同数字给出不同的哈希值)。在比较例如等效值时,这通常不是您想要的。哈希映射。

另一个原因是BigInt被优化为尽可能使用原始类型,因此在许多情况下性能应该更好。

我会使用Clojure的数字类型,除非你有充分的理由不这样做(你使用.isProbablePrime暗示你可能有足够的理由)。