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

Haskell自定义List类型调用sum函数求和出现类型匹配错误

问题解决方法

报错根因

标准库sum函数的类型是Foldable t => t Integer -> Integer,仅支持实现了Foldable类型类的容器类型入参。你自定义的List是独立的代数数据类型,没有匹配Foldable的要求,因此出现类型不匹配错误。

解决方案

方案1:手动递归实现(最简便,无需额外扩展)

直接匹配List的两个构造子写递归逻辑即可,完全不需要修改你原有自定义List和测试用例的代码:

sumList :: List -> Integer
sumList Empty = 0
sumList (Cons num next) = num + sumList next

运行测试用例testSum会输出预期结果:

expected: 20
computed: 20

方案2:实现Foldable实例复用标准库sum

如果希望直接使用标准库的sum函数,可以给自定义List实现Foldable类型类:

  1. 首先在代码文件头部开启推导扩展:
{-# LANGUAGE DeriveFoldable #-}
  1. 修改List定义为支持泛型的结构,自动推导Foldable实例:
data List a = Empty | Cons a (List a) deriving (Show, Foldable)

list :: List Integer
list = Cons 1 (Cons 7 (Cons 9 (Cons 3 Empty)))
  1. 原有sumList定义微调参数类型即可正常运行:
sumList :: List Integer -> Integer
sumList = sum

内容的提问来源于stack exchange,提问作者SourceCodeEngineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:09:01