2011-10-18 120 views
2

我只是试着写一个简单的函数来计算输入的int型平均:哈斯克尔:类型不匹配

avg :: Int -> Int -> Int -> Float 
avg x y z = (x+y+z)/3 

当我交换签名

avg :: Float -> Float -> Float -> Float 

它的工作原理罚款,但与上面的一个我得到以下错误信息:

无法匹配实际类型'诠释'的预期类型'浮动'。

我必须使用第一个签名,它接受Ints(仅)的可能性?

回答

9

使用fromIntegralInt秒值进行转换,以Float S:

avg :: Int -> Int -> Int -> Float 
avg x y z = (fromIntegral x + fromIntegral y + fromIntegral z)/3 
+0

感谢编辑,@hammar。 – dave4420

2

短:

avg :: Int -> Int -> Int -> Float 
avg x y z = (fromIntegral $ sum [x,y,z])/3.0 

或者你概括本作的Int的List:

avg :: [Int] -> Float 
avg xs = (fromIntegral $ sum xs)/(fromIntegral $ length xs) 
+0

不是'x + y + z'比sum [x,y,z]'短吗? –

+0

否,但'fromIntegral $ sum [x,y,z]'短于'从整数x +从整数y + fromInteral z'。而且它更容易概括... – Landei

+0

你正在回答与我所问的不同的东西。 –