Haskell 什么';将两个整数值除以一个浮点值是正确的方法吗?
我想将Haskell中的两个Haskell 什么';将两个整数值除以一个浮点值是正确的方法吗?,haskell,types,floating-point,integer,Haskell,Types,Floating Point,Integer,我想将Haskell中的两个Int值除以,得到一个Float的结果。我试着这样做: foo :: Int -> Int -> Float foo a b = fromRational $ a % b 但GHC(版本6.12.1)告诉我,对于表达式中的a,无法将预期类型“Integer”与推断类型“Int”匹配 我理解原因:调用fromRational需要(%)生成一个比率整数,因此操作数的类型必须是整数,而不是Int。但是我正在划分的值远未达到Int范围限制,因此使用任意精度的bi
Int
值除以,得到一个Float
的结果。我试着这样做:
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
但GHC(版本6.12.1)告诉我,对于表达式中的a
,无法将预期类型“Integer”与推断类型“Int”匹配
我理解原因:调用fromRational
需要(%)
生成一个比率整数
,因此操作数的类型必须是整数
,而不是Int
。但是我正在划分的值远未达到Int
范围限制,因此使用任意精度的bignum类型似乎有些过分
正确的方法是什么?我应该在我的操作数上调用
toInteger
,还是有更好的方法(可能不涉及(%)
和比率)我不知道?您必须先将操作数转换为浮点数,然后再进行除法,否则您将执行整数除法(无小数位数)
Laconic解决方案(需要数据.函数
)
它是
foo a b = (fromIntegral a) / (fromIntegral b)
与
谢谢,这很有道理。我想知道我是否可以先转换成
Float
,但在浏览各种数值类中所有函数的文档时,不知怎的忽略了from integral
。(我不认为另一种方法会像你提到的那样,用整数除法减去小数点,但是:我是用整数做一个Rational
,它不会失去精度。)@Wyzard:你不是用整数做一个有理数。您将操作符的结果视为一个理性的结果,而实际上它不是。查看fromRational
的类型签名:参数是一个有理数,而Ratio Int
和Ratio Integer
都是不同的类型。您可能希望torional
@Chuck:Rational
是Ratio Integer
的别名,(%)
返回一个Ratio
,无论它的操作数是什么类型,所以将它应用于两个Integer
应该会产生一个Rational
(除非我有误解)。我的问题是我给了它Int
并产生了Ratio Int
(这确实不是一个Rational
)。@Wyzard:你可以在这里再次使用from integral
进行转换。。。这很普通。
foo a b = (fromIntegral a) / (fromIntegral b)
foo :: Int -> Int -> Float