Комбинатор с фиксированной точкой не всегда дает правильный ответ с учетом определения:
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 параметром)?