2011-04-13 86 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) 
...