2017-04-03 163 views
0

我见过的所有其他平均问题都比我需要的要复杂得多。我对Haskell很新,我目前正在通过The Craft of Functional Programming 2nd Edition。简单的Haskell平均函数提供了无法匹配的类型错误

在第3章中有一个练习来写一个简单的函数来平均3个整数。提供函数类型签名,并在我的解决方案中使用它。我写道:

averageThree :: Int -> Int -> Int -> Float 
averageThree a b c = (a + b + c)/3 

我用ghci的编译,当我尝试和加载我的文件,我得到“无法匹配预期Float' with actual type类型INT'”。我如何解决这个错误?

回答

1

表达式a + b + c将具有类型Int,并且/甚至未被定义为Int。 GHC可能会推断3的类型为Float。你必须明确地投的类型在这种情况下,所以你需要做的

fromIntegral (a + b + c)/3 

fromIntegral功能需要一个Integral a => a型像IntInteger,并将其转换为Num b => b类型,这也可能是IntIntegralFloat,DoubleComplex Double,甚至自定义数字类型。

+0

就是这样,谢谢。 –

0

(/) :: Fractional a => a -> a -> a,这意味着/取两个相同类型的小数,并返回相同类型的小数。你给它一个Int作为参数,这不是分数,并且要求输出Float。在将其发送给/之前,您必须将您的Int转换为Float。使用fromIntegral :: Int -> FloatfromIntegral (a + b + c)/3。你也可以放弃类型签名并向ghci询问推断出的类型。

1

您应该使用Fractional,以支持房地产事业部:

averageThree :: Fractional a => a -> a -> a -> a 
averageThree a b c = (a + b + c)/3 
相关问题