简单的Haskell平均函数提供了无法匹配的类型错误
问题描述:
我见过的所有其他平均问题都比我需要的要复杂得多。我对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'”。我如何解决这个错误?
答
表达式a + b + c
将具有类型Int
,并且/
甚至未被定义为Int
。 GHC可能会推断3
的类型为Float
。你必须明确地投的类型在这种情况下,所以你需要做的
fromIntegral (a + b + c)/3
的fromIntegral
功能需要一个Integral a => a
型像Int
或Integer
,并将其转换为Num b => b
类型,这也可能是Int
或Integral
或Float
,Double
,Complex Double
,甚至自定义数字类型。
答
(/) :: Fractional a => a -> a -> a
,这意味着/
取两个相同类型的小数,并返回相同类型的小数。你给它一个Int
作为参数,这不是分数,并且要求输出Float
。在将其发送给/
之前,您必须将您的Int
转换为Float
。使用fromIntegral :: Int -> Float
。 fromIntegral (a + b + c)/3
。你也可以放弃类型签名并向ghci询问推断出的类型。
答
您应该使用Fractional,以支持房地产事业部:
averageThree :: Fractional a => a -> a -> a -> a
averageThree a b c = (a + b + c)/3
就是这样,谢谢。 –