Комбинатор с фиксированной запятой в Haskell

Комбинатор с фиксированной точкой не всегда дает правильный ответ с учетом определения:

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 параметром)?

12
задан Will Ness 24 July 2019 в 17:14
поделиться