Haskell 模式匹配隐式类型
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)
我正在尝试制作一个简单的函数来将所有 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 <b>Op2</b> = And | NAnd | Or | NOr | Xor | XNor | Imply | Equiv
然后定义一个带运算符和两个参数的数据构造函数:
data Fml a
= Fml2 <b>Op2</b> (Fml a) (Fml a)
| Not (Fml a)
| Final (Var.Var a)
deriving (Show)
那么你的函数看起来像:
getVar :: Eq a => Fml a -> [<b>Var.Var</b> a]
getVar (Fml2 _ p q) = getVar p ++ getVar q
getVar (Not p) = getVar p
getVar (Final v) = [v]
我认为输出类型应该是 Var.Var
的列表,而不是 Fml a
,因为您的函数暗示它正在寻找变量列表。
我是 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
您可以为运算符定义类型:
data <b>Op2</b> = And | NAnd | Or | NOr | Xor | XNor | Imply | Equiv
然后定义一个带运算符和两个参数的数据构造函数:
data Fml a
= Fml2 <b>Op2</b> (Fml a) (Fml a)
| Not (Fml a)
| Final (Var.Var a)
deriving (Show)
那么你的函数看起来像:
getVar :: Eq a => Fml a -> [<b>Var.Var</b> a]
getVar (Fml2 _ p q) = getVar p ++ getVar q
getVar (Not p) = getVar p
getVar (Final v) = [v]
我认为输出类型应该是 Var.Var
的列表,而不是 Fml a
,因为您的函数暗示它正在寻找变量列表。