【发布时间】:2019-02-20 23:38:24
【问题描述】:
我正在尝试编写一个函数来简化表达式,方法是识别将计算为零的部分,以便 n*0 -> 0 和 n+0 -> n 等。
elimiZeros :: Exp -> Exp
数据类型为:
data Exp = Num Int
| Add Exp Exp
| Sub Exp Exp
| Mult Exp Exp
| Div Exp Exp
| Power Exp Exp
| Neg Exp
deriving Show
为了避免必须自己对每个运算符进行模式匹配,我尝试同时匹配几个,但是我得到一个编译器错误:“模式中的解析错误:a”:
elimiZeros :: Exp -> Exp
elimiZeros (Num n) = (Num n)
elimiZeros (a b c) =
if c == (Num 0)
then case a of
Add -> elimiZeros b
Sub -> elimiZeros b
Mult -> (Num 0)
else if b == (Num 0)
then case a of
Add -> elimiZeros c
Sub -> elimiZeros c
-- etc, not finished
else (a b c)
难道不能用这种语法进行模式匹配吗?
编辑:感谢您的澄清回复!
【问题讨论】:
-
这不是模式匹配的工作原理——您只能针对构造函数执行此操作,并且不能如您在此处看到的那样使用变量来代表构造函数。也许有一个语言扩展允许这样做,如果我不知道的话。但我没有看到您实际上按照自己的方式编写的代码更少——而且我发现与标准方式相比,它的可读性更低。