冗余模式匹配的情况
case of redundant pattern matching
我正在尝试为不同类型的语句编写 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])]
}
case val of case1
并没有像你想的那样做,即检查 val 是否等于 case1。它引入了一个名为 case1 的新绑定,覆盖了现有绑定,其值为 val。您不会免费获得相等比较:您必须通过使用 ==
请求它们,也许在保护子句中,或者在 if
表达式中。因此,您确实有两个冗余模式:永远不会输入 _
子句,因为 case1
模式匹配所有可能的输入。
相反,您自己编写相等性测试。有更好的方法可以做到这一点,但是在对现有功能进行最少更改的同时做到这一点的方法可能是:
... do
val <- evaluate var memory
if val == case1
then interpret ...
else interpret ...
我正在尝试为不同类型的语句编写 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])]
}
case val of case1
并没有像你想的那样做,即检查 val 是否等于 case1。它引入了一个名为 case1 的新绑定,覆盖了现有绑定,其值为 val。您不会免费获得相等比较:您必须通过使用 ==
请求它们,也许在保护子句中,或者在 if
表达式中。因此,您确实有两个冗余模式:永远不会输入 _
子句,因为 case1
模式匹配所有可能的输入。
相反,您自己编写相等性测试。有更好的方法可以做到这一点,但是在对现有功能进行最少更改的同时做到这一点的方法可能是:
... do
val <- evaluate var memory
if val == case1
then interpret ...
else interpret ...