У меня есть функция, которая вычисляет неподвижную точку в терминах итерации:
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
Можно ли записать эту функцию в терминах fix? Кажется, должно быть преобразование от этой схемы к чему-то с исправлением в ней, но я этого не вижу.