冗余图案匹配的情况



我试图为不同类型的语句编写Haskell Interpeter。其中之一就是开关语句。到目前为止,我已经完成了以下操作,但是我已经卡住了,并且在情况表达式中(_-> If长度)行的(_-> If Lengend)线路不断获得冗余图案。如果第一个案例表达式是正确的,则该测试是通过测试的。任何帮助,感谢,谢谢

 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])]
                        } 
case val of case1

不做您想做的事情,即,检查val是否等于案例1。它引入了一种名为case1的新绑定,从而阴影现有的绑定,其值为val。您不会免费获得平等比较:您必须通过使用==,也许是在Guard子句中或在if表达式中要求它们。因此,您确实有两个冗余模式:_子句将永远不会输入,因为case1模式与所有可能的输入匹配。

相反,自己写一个平等测试。有更好的方法可以做到这一点,但是在对您现有功能进行最小更改的同时,可以做到这一点:

... do
  val <- evaluate var memory
  if val == case1
    then interpret ...
    else interpret ...

相关内容

最新更新