haskell - Haskell:将整数除以整数并得到双倍
问题描述
我想编写一个 Haskell 函数,它需要两个Integer
s 潜入它们并输出一个Double
.
签名应如下所示:
divide :: Integer -> Integer -> Double
我想要的功能是:
divide x y = x / y
我得到这个函数的错误消息是:
Couldn't match expected type ‘Double’ with actual type ‘Integer’
如何为此函数获得正确的双重结果?
解决方案
Haskell 是一种强类型语言。这意味着没有重新进行隐式转换。您可以先将这两个数字转换为Double
,例如使用fromIntegral :: (Integral a, Num b) => a -> b
,然后使用(/) :: Fractional a => a -> a -> a
:
divide :: Integer -> Integer -> Double
divide x y = fromIntegral x / fromIntegral y
但是,将数字转换为 aDouble
可能会导致精度损失。
返回 a 可能会更好Ratio
,因此可以使用分数,例如与 the 一起使用(%) :: Integral i => i -> i -> Ratio i
,所以 then divide
is just divide = (%)
。
您可以像@DanielWagner 所说的那样将fromRational
其Rational
转换为任何Fractional
类型:
import Data.Ratio((%))
divide :: Fractional a => Integer -> Integer -> a
divide x y = fromRational (x % y)
因此,您仍然可以将其转换为Double
:
Prelude Data.Ratio> divide 5 2 :: Double
2.5
推荐阅读
- python - Python Windows 服务 - 日志记录不起作用
- python - 计算两个日期之间的时间并返回天数
- javascript - 使用工厂模式引导 vuetify
- angular - Syncfusion ej2 图在更新到 Angular 8.xx 后抛出运行时异常
- java - 如何让 Minimax Alpha Beta 算法发挥自己的作用?
- excel - 保留导入的文件,然后将其附加到电子邮件中
- xslt - 翻译 xslt 中的函数
- arrays - 我正在尝试使用 powershell 将包含多个嵌套数组的 json 文件转换为 csv 文件
- c# - 如何将从客户端上的 opc 输出参数接收到的二进制数据转换为 opc 服务器上定义的数据类型
- ios - Swift Convert UIImage to Data 第一次只给出 560 字节的数据