[英]Haskell pattern matching implicit type
我是 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)我正在嘗試制作一個簡單的 function 以將所有 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
您可以為運算符定義類型:
data Op2 = And | NAnd | Or | NOr | Xor | XNor | Imply | Equiv
然后定義一個帶有運算符和兩個參數的數據構造函數:
data Fml a
= Fml2 Op2 (Fml a) (Fml a)
| Not (Fml a)
| Final (Var.Var a)
deriving (Show)
然后你的 function 看起來像:
getVar :: Eq a => Fml a -> [Var.Var a]
getVar (Fml2 _ p q) = getVar p ++ getVar q
getVar (Not p) = getVar p
getVar (Final v) = [v]
我認為 output 類型應該是Var.Var
的列表,而不是Fml a
,因為您的 function 暗示它正在尋找變量列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.