Я был немного смущен документацией для fix
(хотя я думаю, что понимаю, что он должен делать сейчас), поэтому я посмотрел на исходный код. Это оставило меня более смущенным:
fix :: (a -> a) -> a
fix f = let x = f x in x
Как именно это возвращает неподвижную точку?
Я решил попробовать в командной строке:
Prelude Data.Function> fix id
...
И он там висит. Теперь, чтобы быть справедливым, это на моем старом macbook, который немного медленный. Однако эта функция не может быть слишком дорогостоящей, поскольку все, что передается в id, возвращает ту же самую вещь (не говоря уже о том, что она не потребляет процессорного времени). Что я делаю неправильно?