我有一个序列Seq a
和Eq a
,我想删除这个序列中的重复项。
fromList $ nub $ toList mysequence
字符串
有没有更有效的方法?
这是一个Edge
的序列,其中
data Edge = Edge Int Int
deriving (Show, Read)
instance Eq Edge where
(==) :: Edge -> Edge -> Bool
Edge i j == Edge i' j' = (i == i' && j == j') || (i == j' && j == i')
型
1条答案
按热度按时间af7jpaap1#
如果**
Hashable
被允许包含为类型约束,你可以使用hashNub :: (Witherable t, Eq a, Hashable a) => t a -> t a
**,它将使用哈希来增强唯一性检查。如果只允许
Eq
,那么除了执行 * 二次匹配 *,我们没有什么可以做的。虽然这样做可能比在两者之间转换它更有效,但这可能并不重要:从列表到列表的转换是 * 线性的 *,而nub
以二次时间运行,所以大部分时间将被浪费在检查两个元素是否匹配上。在这种情况下,我们可以实现一个散列函数,它首先散列两个数字中最小的一个,然后散列最大的一个,所以:
字符串