Haskell模式匹配隐式类型

我是 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 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)

那么你的函数看起来像:

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]

我认为输出类型应该是Var.Vars的列表,而不是 a Fml a,因为您的函数暗示它正在寻找变量列表。


以上是Haskell模式匹配隐式类型的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>