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

我想将Haskell中的两个
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