簡體   English   中英

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)我正在嘗試制作一個簡單的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM