equivalenceClosure = fix $ \f e ->
let e' = reflexivity . symmetry . transitivity $ e
in if e' == e then e else f e'
Cheers,
--
Felipe.
I managed something even "clearer". I still have very little intuition about what's going on, but I had an aha moment -- which I promptly forgot :0( -- and at least there's a mechanical translation from the iterate version to the fix one.
equivalenceClosure :: (Ord a) => Relation a -> Relation a