У меня есть отношение эквивалентности R
в наборе A
. Как я могу построить классы эквивалентности на A
? Это что-то вроде groupBy
do, но между всеми элементами не только соседи.
Например, equal
- отношение эквивалентности (оно является рефлексивным, симметричным и транзитивным двоичным отношением):
type Sometuple = (Int, Int, Int)
equal :: Sometuple -> Sometuple -> Bool
equal (_, x, _) (_, y, _) = x == y
На самом деле это предикат, соединяющий 2 Sometuple
.
λ> equal (1,2,3) (1,2,2)
True
Итак, как я могу построить все классы эквивалентности на [Sometuple]
на основе предиката equal
? Что-то вроде этого:
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)]]