考虑以下类型:
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’
但它应该暗示他们必须是一样的。我不能来这里的是什么?
注意:我知道我可以给它们不同的名称,然后在函数体中比较v1
和v2
。这个问题一般是关于模式匹配的,而不是这个具体的例子。
坦克提供任何帮助。
答案 0 :(得分:3)
但它应该暗示他们必须是一样的。我不能来这里的是什么?
只是Haskell不允许这样做。一些使用模式匹配的语言(例如Erlang),其他语言不支持(Haskell,OCaml,Scala)。