我如何总结Double
s?我认为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
是什么赋予了?
第二个函数与第一个函数的类型不同。
(分数a1,积分a2)=> a2 - > a2 - > a1
这里a2是具有Integral实例的任何类型。 Int和Integer都实现了Integral。整数是一种任意精度类型:无论多大,都可以保存任何数字,直到机器内存的极限。 Int不是。例如:
(10 ::整数)^ 100 == 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(10 :: Int)^ 100 == 0
第二种情况可能发生在你的第一个功能中。然后1/0 ==无限
当没有明确的类型声明时,Haskell将假设任何自然数字文字实际上是一个整数。这就是为什么第二个函数在Integers上运行,结果更好