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

Haskell中如何对树映射函数?为何mapTree触发非穷尽模式错误?

问题原因与解决方法

这个错误是因为函数名大小写不一致导致的:

  • 你声明的函数名为mapTree(驼峰写法,第二个字母T大写)
  • 但处理Empty分支时,你写的函数名是maptree(全小写)

在Haskell中,标识符大小写敏感,这相当于你定义了两个完全独立的函数:

  1. 只有Node分支的mapTree,没有处理Empty情况
  2. 只有Empty分支的maptree,和前者毫无关系

所以当调用mapTree时,它只覆盖了Node模式,漏掉了Empty,因此触发“Non-exhaustive patterns in function mapTree”错误。

修正后的代码如下:

data Tree a = Empty | Node a (Tree a) (Tree a)
  deriving (Show, Eq)

mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f Empty = Empty  -- 修正函数名为mapTree,和声明一致
mapTree f (Node x l r) = Node (f x) (mapTree f l) (mapTree f r)

只需要把maptree改成mapTree,让两个分支属于同一个函数,覆盖Tree的所有构造器(Empty和Node),问题就解决了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:41:25