Haskell实现树求和时a与预期类型Integer不匹配错误如何解决
类型错误产生原因
- 受Haskell单态限制约束,你全局定义的
sumTotal = 0没有显式声明泛型签名,会被默认推导为固定的Integer类型,而非泛型的Num a => a。在sumTree分支中执行sumTotal + a运算时,编译器会要求类型变量a必须和sumTotal的类型一致,也就是a ~ Integer,和你声明的sumTree :: Num a => Tree a -> a泛型签名冲突,因此触发类型不匹配错误。 - 递归调用语句存在语法错误,右子树求和的
sumTree调用漏传了参数r,也会导致编译校验失败。 - 从逻辑上看
sumTotal本身是冗余设计,Haskell为纯函数式语言,全局常量不会在函数执行过程中更新,加上它没有任何实际作用,反而引入了类型冲突。
修复后的代码
data Tree a = Tip | Bin (Tree a) a (Tree a) sumTree :: Num a => Tree a -> a sumTree Tip = 0 sumTree (Bin l a r) = a + sumTree l + sumTree r
修复说明
- 删除了冗余的
sumTotal全局变量,所有运算都基于泛型Num类型实例实现,完全匹配函数签名的泛型要求 - 补全了右子树
r的递归调用参数,遍历逻辑覆盖整棵树的所有节点 - 修复后的代码支持任意数值类型的Tree求和,
Tree Int、Tree Double等Num实例类型的树结构都可以正常调用sumTree计算总和
内容的提问来源于stack exchange,提问作者Amruta Turlapati
相关产品推荐
相关产品推荐

