【发布时间】:2020-12-06 20:58:58
【问题描述】:
我是 Haskell 的新手,我正在尝试用模式匹配做一些事情。我什至不知道这是否可能。 我有一个数据 Fml:
data Fml a = And (Fml a) (Fml a)
| NAnd (Fml a) (Fml a)
| Or (Fml a) (Fml a)
| NOr (Fml a) (Fml a)
| XOr (Fml a) (Fml a)
| XNOr (Fml a) (Fml a)
| Imply (Fml a) (Fml a)
| Equiv (Fml a) (Fml a)
| Not (Fml a)
| Final (Var.Var a)
deriving (Show)
Var 只是一个值(例如:1) 我正在尝试制作一个简单的函数来将所有 Var 合并到一个数组中。我已经这样做了:
getVar :: (Eq a) => Fml a -> [Fml a]
getVar (And p q) = getVar p ++ getVar q
getVar (NAnd p q) = getVar p ++ getVar q
getVar (Or p q) = getVar p ++ getVar q
getVar (NOr p q) = getVar p ++ getVar q
getVar (XOr p q) = getVar p ++ getVar q
getVar (XNOr p q) = getVar p ++ getVar q
getVar (Imply p q) = getVar p ++ getVar q
getVar (Equiv p q) = getVar p ++ getVar q
getVar (Not p) = getVar p
getVar x = [x]
但我并不满意,因为其中 8 个案例都在做同样的事情。 我想知道是否可以做这样的事情
getVar (_ p q) = getVar p ++ getVar q
【问题讨论】:
-
最后一个case应该是
getVar (Final x) = [x]吧?除非您想编写 Template Haskell 代码,否则这是不可能的。 -
getVar x = [x] 工作正常,因为我想返回 [Fml] 好的!谢谢:)
-
@NicolasFAU: 但这看起来很“奇怪”,因为你的函数提示你返回变量,而这里你返回的是公式。 公式都具有相同的数据构造函数,但类型构造函数不知道。