首页 > 解决方案 > Haskell:将整数除以整数并得到双倍

问题描述

我想编写一个 Haskell 函数,它需要两个Integers 潜入它们并输出一个Double.

签名应如下所示:

divide :: Integer -> Integer -> Double

我想要的功能是:

divide x y = x / y

我得到这个函数的错误消息是:

Couldn't match expected type ‘Double’ with actual type ‘Integer’

如何为此函数获得正确的双重结果?

标签: haskelldivision

解决方案


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 divideis just divide = (%)

您可以像@DanielWagner 所说的那样将fromRationalRational转换为任何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

推荐阅读