我开始了我的Haskell之旅,遇到了我的第一个问题:
在我的Haskell脚本中:myList = [1, 2, 3, 4, 5, 6, 7]
average ns = sum ns `div` length ns
当我在ghci repl
时,我得到两个不同的结果:
- 如果输入
> average [1, 2, 3, 4]
,则得到2
的期望值 - 但如果我尝试使用myList和类型
> average myList
,我得到错误"无法匹配类型' Integer '与' Int ' ">
我理解(至少我认为我这样做)没有变量的概念,所以myList
只是一个返回"硬编码"的函数。每次调用时都列出。
我怎么能使它工作,为什么它是这样的行为?
length
将返回一个Int
,而sum
将返回一个与列表中项目类型相同的数字(这里可能是Integer
)。
可以使用fromIntegral :: (Integral a, Num b) => a -> b
将Integral
类型的数字转换为任何Num
类型,例如将Int
转换为Integer
。
因此我们可以这样实现:
average :: Integral a => [a] -> a
average ns = sum ns `div`fromIntegral (length ns)
因为你使用了div :: Integral a => a -> a -> a
因此,将两个操作数和结果约束为相同的类型,该类型应该是Integral
类型类的成员。