0

我正在尝试为不同类型的语句编写一个haskell interpeter。其中之一是 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])]
                        } 
4

1 回答 1

5
case val of case1

不做你认为它做的事,即检查 val 是否等于 case1。它引入了一个名为 case1 的新绑定,隐藏了现有绑定,其值为 val。您不会免费获得相等比较:您必须通过使用==,也许在保护子句或if表达式中来请求它们。因此,您确实有两个冗余模式:_永远不会输入子句,因为该case1模式匹配所有可能的输入。

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

... do
  val <- evaluate var memory
  if val == case1
    then interpret ...
    else interpret ...
于 2019-03-18T17:10:58.960 回答