Haskell将整数转换为浮点数

12

我遇到了一个问题,与我不太熟悉的一个函数有关,它是 fromIntegral 函数。

基本上,我需要输入两个 Int 类型的参数并返回数字的百分比,但当我运行我的代码时,它一直给我这个错误:

代码:

percent :: Int -> Int -> Float
percent x y =   100 * ( a `div` b )
where   a = fromIntegral x :: Float
        b = fromIntegral y :: Float

错误:

No instance for (Integral Float)
arising from a use of `div'
Possible fix: add an instance declaration for (Integral Float)
In the second argument of `(*)', namely `(a `div` b)'
In the expression: 100 * (a `div` b)
In an equation for `percent':
    percent x y
      = 100 * (a `div` b)
      where
          a = fromIntegral x :: Float
          b = fromIntegral y :: Float

我阅读了'98 Haskell预设文档,上面提到有一个名为fromInt的函数,但它从未起作用,所以我不得不使用这个,但它仍然无法工作。请帮忙!


1
我怀疑98年的报告声称有一个fromInt函数。 - augustss
2个回答

26

看一下 div 的类型:

div :: Integral a => a -> a -> a

你不能将输入转换为 Float 然后使用 div

应该使用 (/) 代替:

(/) :: Fractional a => a -> a -> a
以下代码可行:
percent :: Int -> Int -> Float
percent x y =   100 * ( a / b )
  where a = fromIntegral x :: Float
        b = fromIntegral y :: Float

哦,谢谢提醒,我一直在使用 div,忘记看看替代方案了!我的错,再次感谢! - Syafiq Kamarul Azman
1
为了简洁起见,您不需要强制使用类型 :: Float - rotskoff
使用 Data.Function.on,你可以这样写:percent x y = 100 * ((/) on fromIntegral) x y(将 ' 替换为反引号) - Landei

0

或者你可以这样做

precent :: Int -> Int -> Float
percent x y = 100 * ( int(a) / int(b) ) 
  where int = fromIntegral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接