自定义类型中的模式匹配

时间:2017-04-12 06:00:34

标签: haskell pattern-matching

考虑以下类型:

data MyType = MyType Val Col deriving (Eq, Show)
data Val = Val A | B | C deriving (Eq, Ord, Show, Read)
data Col = X | Y | Z deriving (Eq, Ord, Show, Read)

如果我现在有一个像sameVal :: MyType -> MyType -> Bool这样的函数应该检查Val字段是否相等并尝试这样做:

sameVal (MyType v _) (MyType v _) = True
sameVal _ _ = False

GHC抱怨我告诉我v定义相互矛盾......

Conflicting definitions for ‘v’
Bound at: htest.hs:6:14
          htest.hs:6:24
In an equation for ‘sameVal’

但它应该暗示他们必须是一样的。我不能来这里的是什么?

注意:我知道我可以给它们不同的名称,然后在函数体中比较v1v2。这个问题一般是关于模式匹配的,而不是这个具体的例子。

坦克提供任何帮助。

1 个答案:

答案 0 :(得分:3)

  

但它应该暗示他们必须是一样的。我不能来这里的是什么?

只是Haskell不允许这样做。一些使用模式匹配的语言(例如Erlang),其他语言不支持(Haskell,OCaml,Scala)。