我正在尝试为不同类型的语句编写haskell插入器。一个这样的语句是switch语句。到目前为止,我已经完成了以下操作,但仍然遇到问题,在case表达式中,对于(_-> if length)行,我不断收到多余的模式匹配警告。如果第一个case表达式正确,则通过测试,如果不是,则测试失败。任何帮助表示感谢,谢谢
interpret :: Program -> Memory -> Either Err Memory
interpret [] memory = Right memory
interpret (SwitchStmt var c:p) memory = let case1 = fst(c!!0)
case2 = snd(c!!0)
in do
val <- evaluate var memory
case val of case1 -> (interpret (case2++p) memory)
_ -> if length c > 1 then interpret ((SwitchStmt var (tail c)):p) memory
else interpret p memory
我已经定义了这样的数据类型:
data Stmt = SwitchStmt{
switchVar :: Expr,
switchCase :: [(Expr,[Stmt])]
}
答案 0 :(得分:5)
case val of case1
不执行您认为的操作,即检查val是否等于case1。它引入了一个名为case1的新绑定,该绑定隐藏了值为val的现有绑定。您不会免费获得相等性比较:您必须通过使用==
来要求它们,也许是在保护子句中或在if
表达式中。因此,您确实有两个冗余模式:_
子句将永远不会输入,因为case1
模式匹配所有可能的输入。
相反,请自己编写一个相等性测试。有更好的方法可以执行此操作,但是在对现有功能进行最小更改的同时执行此操作的方法可能是:
... do
val <- evaluate var memory
if val == case1
then interpret ...
else interpret ...