我定义了一个类型
data Expr =
Const Double
| Add Expr Expr
| Sub Expr Expr
并将其声明为 Eq
类型类的一个实例:
instance Eq Expr where
(Add (Const a1) (Const a2)) == Const b = a1+a2 == b
(Add (Const a1) (Const a2)) == (Add (Const b1) (Const b2)) = a1+a2 == b1 + b2
当然,表达式
Sub (Const 1) (Const 1) == Const 0
的评估将失败。我如何在运行时调试模式匹配过程以发现它失败了?我想看看Haskell如何获取==
的参数并遍历这些模式。这是否可能?
-Wall
进行编译,GHC可以在编译时检测到问题,它会警告你存在不完整的模式并显示你错过了哪些情况。请注意,我已尽力让翻译通俗易懂,但并未改变原意。 - hammar-fwarn-incomplete-patterns
。请查看https://dev59.com/-Wsz5IYBdhLWcg3weHgA以了解其工作原理。顺便说一句,在您的示例中,我建议编写`eval :: Expr -> Double,然后编写
x == y = eval x == eval y`,但这仍然相当不标准。 - sdcvvc-fwarn-incomplete-patterns
并将其视为错误。强制自己编写一个完整的函数将帮助您了解缺少哪些模式匹配。 - Gabriella GonzalezShow
实例,以查看它实际上是由哪些构造函数构建的。有时,如果某个值没有匹配到你认为应该匹配的模式,那么可能是因为它实际上不是你认为的那个值。 - Gabriella Gonzalez