我有一个关于集合A
的等价关系R
。如何在A
上构建等价类?这有点像groupBy
,但是不仅限于相邻元素。
例如,equal
是一种等价关系(它是自反、对称和传递二元关系):
type Sometuple = (Int, Int, Int)
equal :: Sometuple -> Sometuple -> Bool
equal (_, x, _) (_, y, _) = x == y
它实际上是一个谓词,用于连接两个Sometuple
元素。
λ> equal (1,2,3) (1,2,2)
True
那么,我如何基于equal
谓词在[Sometuple]
上构建所有等价类?就像这样:
equivalenceClasses :: (Sometuple -> Sometuple -> Bool) -> [Sometuple] -> [[Sometuple]]
λ> equivalenceClasses equal [(1,2,3), (2,1,4), (0,3,2), (9,2,1), (5,3,1), (1,3,1)]
[[(1,2,3),(9,2,1)],[(2,1,4)],[(0,3,2),(5,3,1),(1,3,2)]]
equivalence
包需要一些可变的单子上下文 (IO
或ST
)。尝试使用persistent-equivalence
代替,它更加简洁。 - mergeconflict