haskell - 如何计算双打数?
问题描述
我如何求和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
是什么赋予了?
解决方案
第二个函数的类型与第一个函数不同。
(分数 a1,积分 a2)=> a2 -> a2 -> a1
这里 a2 是任何具有 Integral 实例的类型。Int 和 Integer 都实现了 Integral。Integer 是一种任意精度类型:它可以容纳任何数字,无论多大,直到机器内存的限制。诠释不是。例如:
(10::整数)^100 == 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000
(10::Int)^100 == 0
第二种情况可能发生在您的第一个函数中。然后1/0 == 无穷大
当没有明确的类型声明时,Haskell 将假定任何自然数文字实际上都是整数。这就是为什么第二个函数对整数进行操作并且结果更好的原因
推荐阅读
- c++ - 特殊键输入不起作用(回车、退格、制表符等)
- typescript - 如何为仅公开一个构造函数的 TypeScript 库编写类型定义?
- python-3.x - openpyxl 向下迭代列并应用公式,跳过第一行
- blockchain - Solidity 使用技术编写代码
- javascript - 从函数返回变量和承诺
- php - 如何在同一个 apache 服务器上为两个项目运行两个版本的 PHP
- angular - 想在我的 ionic 4 项目中从 firestore 中删除一组数据
- asp.net-web-api - 使用 netsqlazman 注册并登录系统
- javascript - 浏览器会卸载加载的脚本吗?
- javascript - 处理 API 请求时不会触发事件