haskell 删除重复的Data.Sequence

xxe27gdn  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个序列Seq aEq 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')

af7jpaap

af7jpaap1#

如果**Hashable被允许包含为类型约束,你可以使用hashNub :: (Witherable t, Eq a, Hashable a) => t a -> t a**,它将使用哈希来增强唯一性检查。
如果只允许Eq,那么除了执行 * 二次匹配 *,我们没有什么可以做的。虽然这样做可能比在两者之间转换它更有效,但这可能并不重要:从列表到列表的转换是 * 线性的 *,而nub以二次时间运行,所以大部分时间将被浪费在检查两个元素是否匹配上。
在这种情况下,我们可以实现一个散列函数,它首先散列两个数字中最小的一个,然后散列最大的一个,所以:

instance Hashable Edge where
  hashWithSalt s (Edge m1 m2) = hashWithSalt s (min m1 m2) `hashWithSalt` (max m1 m2)

字符串

相关问题