如何加总双打次数?

问题描述 投票:1回答:1

我如何总结Doubles?我认为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

是什么赋予了?

haskell double precision
1个回答
5
投票

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

(分数a1,积分a2)=> a2 - > a2 - > a1

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

(10 ::整数)^ 100 == 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

(10 :: Int)^ 100 == 0

第二种情况可能发生在你的第一个功能中。然后1/0 ==无限

当没有明确的类型声明时,Haskell将假设任何自然数字文字实际上是一个整数。这就是为什么第二个函数在Integers上运行,结果更好

© www.soinside.com 2019 - 2024. All rights reserved.