Haskell中如何对树映射函数?为何mapTree触发非穷尽模式错误?
问题原因与解决方法
这个错误是因为函数名大小写不一致导致的:
- 你声明的函数名为
mapTree(驼峰写法,第二个字母T大写) - 但处理
Empty分支时,你写的函数名是maptree(全小写)
在Haskell中,标识符大小写敏感,这相当于你定义了两个完全独立的函数:
- 只有
Node分支的mapTree,没有处理Empty情况 - 只有
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
相关产品推荐
相关产品推荐

