2011-04-13 79 views
1

我试图让一个元组列表以一种特定的方式存储一些信息。如scotland属于ukengland属于uk,等于是两个字符串作为参数(String -> String -> Bool)做出这样的:Haskell:如何比较元组?

Main> owns "china" "beijing" 
True 
Main> owns "uk" "beijing" 
False 

这里是我的代码:

lst = [("uk","scotland"),("uk","england"),("uk","wales"),("china","beijing"),("china","hongkong"),("china","shanghai")] 

owns :: String -> String -> Bool 
owns a b = [n|(a,b) <- lst, (n == a)] && [m|(a,b) <- lst, (m==b] 

感谢您的帮助。

回答

2

寻找在哈斯克尔名单库“协会名单”,以及lookup功能:

Prelude> lookup "china" ls 
Just "beijing" 

其中lookup作为实施:

lookup _key []   = Nothing 
lookup key ((x,y):xys) 
    | key == x   = Just y 
    | otherwise   = lookup key xys 

一旦你可以通过它的键查找元素,那么您可以将其与预期值进行比较。

+0

@user notice'lookup'只返回第一个匹配项,所以这不适合您的需要。 FUZxxl有一个很简单的构造元组并使用'elem'作为查询的好方法。 – 2011-04-13 20:20:37

6

如果我理解你的问题的权利,你建立一个关系表。然后,你得到一个单一的关系,并想检查,无论它在这个表中?只需使用elem即可。当且仅当a在b中时,elem a b才为真。

+0

例如:elem(“china”,“beijing”)lst – Anm 2011-04-13 21:59:39

+1

按照惯例:''(“china”,“beijing”)'elem' lst''。 – luqui 2011-04-17 11:00:51

0

这里是为owns函数的定义:

owns :: String -> String -> Bool 
owns a b = (a,b) `elem` lst 

要回答你的问题的标题,同样长度的任何两个元可如果它们的元素可以比较比较。如果您现在对类型类很熟悉,那么

(Eq a, Eq b) => Eq (a, b) 
(Eq a, Eq b, Eq c) => Eq (a, b, c) 
...