Haskell 警告:模式匹配是多余的

问题描述

我在 Haskell 中创建了一个函数来计算给定表达式中函数和运算符的数量

size :: Expr -> Int
size (Num n) = 1
size x       = 1
size (Function f e) = 1 + size e
size (Operation o e1 e2) = 1 + size e1 + size e2

虽然它按预期工作没有任何错误,但我收到警告:[-Woverlapping-patterns] 说模式匹配是多余的。任何建议将不胜感激!

解决方法

case 子句的顺序很重要 - 传入的值从上到下与模式匹配,如果这些检查中的任何一个成功,则采用该选项。在您的情况下,变量 x 将通过将 x 分配给该事物来成功匹配 anything。因此,它下面的所有情况都不会被考虑。

也许你想要:

size :: Expr -> Int
size (Num n) = 1  -- btw,you can skip this line
size (Function f e) = 1 + size e
size (Operation o e1 e2) = 1 + size e1 + size e2
size x       = 1