我想编写一个 Haskell 函数,它需要两个Integers 并输出一个Double.
签名应如下所示:
divide :: Integer -> Integer -> Double
Run Code Online (Sandbox Code Playgroud)
我想要的功能是:
divide x y = x / y
Run Code Online (Sandbox Code Playgroud)
我用这个函数得到的错误信息是:
Couldn't match expected type ‘Double’ with actual type ‘Integer’
Run Code Online (Sandbox Code Playgroud)
如何获得此函数的正确双重结果?
Wil*_*sem 11
Haskell 是一种强类型语言。这意味着没有重新完成隐式转换。您可以先将两个数字转换为 a Double,例如使用fromIntegral :: (Integral a, Num b) => a -> b,然后使用(/) :: Fractional a => a -> a -> a:
divide :: Integer -> Integer -> Double
divide x y = fromIntegral x / fromIntegral yRun Code Online (Sandbox Code Playgroud)
但是,将数字转换为 aDouble可能会导致精度损失。
返回 a 可能更好Ratio,因此使用分数,例如与(%) :: Integral i => i -> i -> Ratio i,那么divide就是divide = (%)。
您可以像@DanielWagner 所说的那样用于fromRational将 转换Rational为任何Fractional类型:
import Data.Ratio((%))
divide :: Fractional a => Integer -> Integer -> a
divide x y = fromRational (x % y)Run Code Online (Sandbox Code Playgroud)
那么你仍然可以将它转换为 a Double:
Prelude Data.Ratio> divide 5 2 :: Double
2.5
Run Code Online (Sandbox Code Playgroud)