27 lines
862 B
Haskell
27 lines
862 B
Haskell
|
import Control.Monad (mapM_)
|
||
|
import Data.List (partition)
|
||
|
|
||
|
-- | Split off any nums that satisfy the relation and return the split and the rest in a tuple
|
||
|
splitOffRelatedNums :: (Integer -> Integer -> Bool) -> [Integer] -> ([Integer],[Integer])
|
||
|
splitOffRelatedNums relation nums = partition (relation x) nums
|
||
|
where
|
||
|
x = head nums
|
||
|
|
||
|
-- | Split off equivalence groups until there are no more that satisfy the condition
|
||
|
getEquivalenceClasses :: (Integer -> Integer -> Bool) -> [Integer] -> [[Integer]]
|
||
|
getEquivalenceClasses relation nums
|
||
|
= case nums of
|
||
|
[] -> []
|
||
|
nums -> x : getEquivalenceClasses relation xs
|
||
|
where
|
||
|
(x,xs) = splitOffRelatedNums relation nums
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
let
|
||
|
setA = [1..7]
|
||
|
|
||
|
relation :: Integer -> Integer -> Bool
|
||
|
relation x y = (x - y) `mod` 3 == 0
|
||
|
|
||
|
mapM_ print $ getEquivalenceClasses relation setA
|