从Haskell中的元组列表中返回唯一元组

时间:2013-04-19 22:44:13

标签: haskell

我有一个[(A,B),(B,A),(D,C),(E,F),(C,D),(F,E)]形式的元组列表。如何返回仅[(A,B),(C,D),(E,F)]的列表?我发现的唯一解决方案是删除重复的元组,我能想到的唯一解决方案是天真的O(n ^ 2)解决方案。有效的方法吗?

1 个答案:

答案 0 :(得分:5)

如果对的组件类型在类Ord中,则可以在O(n log n)时间内完成:

import Data.List (sort, group)

sortPair        :: Ord a => (a, a) -> (a, a)
sortPair (x, y)
  | x <= y      =  (x, y)
  | otherwise   =  (y, x)

uniques :: Ord a => [(a, a)] -> [(a, a)]
uniques =  map head . group . sort . map sortPair

所以,如果我们定义

data T = A | B | C | D | E | F deriving (Eq, Ord, Show)

我们有,例如:

> uniques [(A,B),(B,A),(D,C),(E,F),(C,D),(F,E)]
[(A,B),(C,D),(E,F)]