Комбинатор с фиксированной точкой не всегда дает правильный ответ, учитывая определение:
fix f = f (fix f)
Следующий код не заканчивается:
fix (\x->x*x) 0
Конечно, fix
не всегда может дать правильный ответ, но мне было интересно, можно ли это улучшить?
Конечно, для приведенного выше примера можно реализовать некоторое исправление, которое выглядит как
fix f x | f x == f (f x) = f x
| otherwise = fix f (f x)
и дает правильный результат.
В чем причина того, что приведенное выше определение (или что-то еще лучше, поскольку эта функция обрабатывает только 1 параметр) вместо этого не используется?