Haskell中元组上的模式匹配相等

elm*_*elm 1 haskell tuples equality pattern-matching

对于关于元组对称相等的这个函数,

symEq :: Eq a => (a,a) -> (a,a) -> Bool
symEq (x,y) (u,v) = (x,y) == (u,v) || (x,y) == (v,u)
Run Code Online (Sandbox Code Playgroud)

我想用模式匹配重写它,如下所示,

symEq' :: Eq a => (a,a) -> (a,a) -> Bool
symEq' (x,y) (x,y) = True
symEq' (x,y) (y,x) = True
symEq' _ _ = False
Run Code Online (Sandbox Code Playgroud)

后者因为x和的冲突定义错误而失败y.如何重写symEq并利用模式匹配?

Ørj*_*sen 6

与某些语言不同(我听说Erlang以这种方式工作),在Haskell中的模式中重复变量名称并不会比较在这两个地方找到的值,而且通常是一个错误.所以你需要使用==它.

总之,这里是一个稍微编写功能更简洁的方式:

symEq t (x,y) = t == (x,y) || t == (y,x)
Run Code Online (Sandbox Code Playgroud)

甚至

symEq t (x,y) = t `elem` [(x,y), (y,x)]
Run Code Online (Sandbox Code Playgroud)