Haskell编写average函数遇类型匹配错误,求调试帮助
解决Haskell列表平均值函数的类型错误问题
错误根源
你写的average ns = sum ns div length ns之所以报错,核心是Haskell的函数应用优先级远高于中缀运算符。编译器会把这个表达式错误解析成:
((sum ns) div length) ns
也就是说,它误以为sum ns的结果(一个Int值)是一个需要接收三个参数的函数,这显然和sum ns的实际类型矛盾——这就是错误信息里“sum被应用了四个参数”的由来(sum本身只需要ns一个参数,错误解析让它的结果被当作函数又接收了div、length、ns三个参数)。
括号写法生效的原因
average ns = div (sum ns) (length ns)能正常运行,是因为括号明确划定了div的两个操作数:第一个是sum ns的计算结果,第二个是length ns的结果,完美匹配div :: Int -> Int -> Int的类型签名。
符合直觉的替代写法
如果想保留类似中缀运算符的直观写法,可以把div用反引号包裹成中缀形式,同时用括号明确函数应用的范围:
average ns = (sum ns) `div` (length ns)
这样既符合你的直觉,又能让编译器正确识别操作数,避免类型错误。
必知语法规则
- Haskell中空格分隔的函数应用优先级最高,所有中缀运算符的优先级都低于它;
- 可以通过括号改变运算顺序,或用反引号将前缀函数转为中缀形式。
内容的提问来源于stack exchange,提问作者bimmui
相关产品推荐
相关产品推荐

