如果有数据类型
data Arith = Con Int
| Add Arith Arith
| Sub Arith Arith
| Mul Arith Arith
| Div Arith Arith
一个例子:
instance Show Arith where
show (Con i) = show i
show (Add e1 e2) = "(" ++ show e1 ++ " + " ++ show e2 ++ ")"
show (Sub e1 e2) = "(" ++ show e1 ++ " - " ++ show e2 ++ ")"
show (Mul e1 e2) = "(" ++ show e1 ++ " * " ++ show e2 ++ ")"
show (Div e1 e2) = "(" ++ show e1 ++ " / " ++ show e2 ++ ")"
和一个函数评估预期的行为如下:
ghci> eval (Mul (Con 5) (Div (Con 6) (Con 2) ))
15
这就是我想出的,当我尝试比基本案例更复杂的东西时,它不起作用。
eval :: ArithExp -> Int
eval (Con e1) = e1
eval (Add (Con e1) (Con e2)) = e1 + e2
eval (Sub (Con e1) (Con e2)) = e1 - e2
eval (Div (Con e1) (Con e2)) = e1 `div` e2
eval (Mul (Con e1) (Con e2)) = e1 * e2
当我尝试任何不在这种情况下的东西时,我当然会收到关于详尽模式的错误。
所以我的问题是,我如何在不幼稚的情况下捕捉所有模式?
我确实注意到 Add 被定义为 Add Arith Arith, Sub Arith Arith 那么我将如何在我的 eval 函数中利用它呢?我试着做:
eval (Add Arith Arith) = Arith + Arith
但这也不起作用,(不在范围错误中)。
您不需要给我一个完整的工作代码示例或任何东西,我只是想指出正确的方向。在haskell还是新手。
谢谢。