You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 08:06:28