我见过的所有其他平均问题都比我需要的要复杂得多 . 我是Haskell的新手,我目前正在通过The Craft of Functional Programming 2nd Edition .
在第3章中,练习编写一个简单函数来平均3个整数 . 提供了函数类型签名,我在我的解决方案中使用它 . 我写:
averageThree :: Int -> Int -> Int -> Float
averageThree a b c = (a + b + c) / 3
我使用ghci进行编译,当我尝试加载我的文件时,我得到“无法匹配预期类型 Float' with actual type
Int'” . 我该如何解决这个错误?
3 回答
(/) :: Fractional a => a -> a -> a
,表示/
采用相同类型的两个小数,并返回相同类型的小数 . 你给它一个Int
作为参数,这不是小数,并要求Float
作为输出 . 您必须将Int
转换为Float
,然后才能将其转换为/
. 使用fromIntegral :: Int -> Float
.fromIntegral (a + b + c) / 3
. 您也可以省略类型签名并向ghci询问推断类型 .表达式
a + b + c
的类型为Int
,/
甚至没有为Int
定义 . GHC可能会推断3
的类型为Float
. 你必须在这种情况下明确地转换类型,所以你需要这样做fromIntegral
函数采用Integral a => a
类型,如Int
或Integer
,并将其转换为Num b => b
类型,也可以是Int
或Integral
,或Float
,Double
,Complex Double
,甚至是自定义数字类型 .您应该使用Fractional来支持Real分部: