2009-11-22 19 views
4

在Haskell中,有没有比较所有通配符具有相同类型和值的方法?例如,我想创建表现出以下行为的函数:比较通配符在Haskell中是否相等?

(1 M) (2 M) (3 M) -> True 
(1 S) (2 S) (3 S) -> True 
(1 S) (2 M) (3 S) -> False 

换句话说,第一个参数应为1,2和3,第二个参数应该是所有的S或全部M.

在这种情况下,我们也许可以写一个函数如下:

matches (1 _) (2 _) (3 _) 

但是,我们如何判断通配符是否全部为S或所有的M?

+1

这是否意味着您正在寻找S&M? – ThisSuitIsBlackNot

回答

4

你要做的平等检查明确,通过使用命名变量,而不是通配符:

matches (1 a) (2 b) (3 c) | a == b && b == c = something 

(正如一个侧面说明:(1 a)是不是一个有效的模式,你需要(1,a)或一些其他类型的构造函数)

5

如果模式很简单(所有M或全部S),为什么不定义它?

matches (1, M) (2, M) (3, M) = True 
matches (1, S) (2, S) (3, S) = True 
matches _ _ _ = False 

或者还有其他限制吗?

+0

是的,实际上有10个constriants ... – pokiman