【问题标题】:Haskell pattern matching implicit typeHaskell 模式匹配隐式类型
【发布时间】: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: 但这看起来很“奇怪”,因为你的函数提示你返回变量,而这里你返回的是公式公式都具有相同的数据构造函数,但类型构造函数不知道。

标签: haskell pattern-matching


【解决方案1】:

你可以为操作符定义一个类型:

data <b>Op2</b> = 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 的列表,而不是Fml a,因为您的函数暗示它正在寻找变量列表。

【讨论】:

  • 完美!非常感谢。对于函数的返回,我表达得很糟糕。我需要 Fml 而不是 Var
  • @NicolasFAU:不过,建议将getVar 的结果类型设为[Var a],因为这样更精确。然后,如果您想从中创建一个Fml,您可以简单地对其进行map Final,但是当您知道您有一个变量时,您将不需要像case x of { Final v -&gt; {- do something with var -}; _ -&gt; error "should not happen" } 这样的虚假模式匹配.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多