FWIW, what you have written is equivalent to equivalenceClosure = fix (const (reflexivity . symmetry . transitivity))
and because the fixed point of `const a` is `a`, equivalenceClosure = reflexivity . symmetry . transitivity which obviously only performs a single pass on its input On Fri, Jun 10, 2011 at 12:10:16PM -0700, Alexander Solla wrote: > On Fri, Jun 10, 2011 at 12:05 PM, Alexander Solla <[email protected]>wrote: > > > On Thu, Jun 9, 2011 at 6:04 PM, Felipe Almeida Lessa < > > [email protected]> wrote: > > > >> Something like this? > >> > >> 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 > > equivalenceClosure = fix (\f -> reflexivity . symmetry . transitivity) > > > > Cancel that, it's not passing my tests. > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
