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类型类:
- 首先在代码文件头部开启推导扩展:
{-# LANGUAGE DeriveFoldable #-}
- 修改
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)))
- 原有
sumList定义微调参数类型即可正常运行:
sumList :: List Integer -> Integer sumList = sum
内容的提问来源于stack exchange,提问作者SourceCodeEngineer
相关产品推荐
相关产品推荐

