gpt4 book ai didi

haskell - 如何计算 double 的数量?

转载 作者:行者123 更新时间:2023-12-02 00:20:48 25 4
gpt4 key购买 nike

如何对 Double 求和?我认为 sum 会开箱即用,当我只使用类型推断时它确实看起来确实如此,但是当我给出一个类型签名将输出类型固定为 Double总和变得无穷大!

这行不通:

doubles :: Int -> Int -> Double
doubles maxk maxn = sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]

我看到了这种行为:

*Main> doubles 20 1500
Infinity

但是,没有类型签名,相同的代码:

doubles maxk maxn =  sum [1/(fromIntegral(i*(j+1)^(2*i)))|i<-[1..maxk],j<-[1..maxn]]

产生一个合理的答案:

*Main> doubles 20 1500
0.692481179869307

什么给了?

最佳答案

第二个函数的类型与第一个不同。

(Fractional a1, Integral a2) => a2 -> a2 -> a1

这里的 a2 是任何具有 Integral 实例的类型。 Int 和 Integer 都实现了 Integral。 Integer 是一种任意精度类型:它可以容纳任何数字,无论它有多大,直到您机器内存的限制。 Int 不是。例如:

(10::Integer)^100 == 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(10::Int)^100 == 0

第二种情况可能发生在您的第一个函数中。然后 1/0 == Infinity

当没有明确的类型声明时,Haskell 会假定任何自然数字面量实际上是一个整数。这就是为什么第二个函数对整数进行操作并且结果更好

关于haskell - 如何计算 double 的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55440904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com