У меня есть функция, которая вычисляет фиксированную точку в терминах итерации:
equivalenceClosure :: (Ord a) => Relation a -> Relation a
equivalenceClosure = fst . List.head -- "guaranteed" to exist
. List.dropWhile (uncurry (/=)) -- removes pairs that are not equal
. U.List.pairwise (,) -- applies (,) to adjacent list elements
. iterate ( reflexivity
. symmetry
. transitivity
)
Обратите внимание, что мы можем абстрагироваться от этого до:
findFixedPoint :: (a -> a) -> a -> a
findFixedPoint f = fst . List.head
. List.dropWhile (uncurry (/=)) -- dropWhile we have not reached the fixed point
. U.List.pairwise (,) -- applies (,) to adjacent list elements
. iterate
$ f
Можно ли записать эту функцию в терминах исправить? Вроде должно быть преобразование этой схемы во что-то с исправлением в ней, но я этого не вижу.