Глядя на исходный код GHC, я вижу, что определение fix:
fix :: (a -> a) -> a
fix f = let x = f x in x
В примере исправление используется следующим образом:
fix (\f x -> let x' = x+1 in x:f x')
Это в основном дает последовательность чисел, увеличивающихся на единицу до бесконечности. Чтобы это произошло, fix должен выполнять функцию, которую он получает обратно в эту самую функцию в качестве первого параметра. Мне непонятно, как это может сделать определение fix, перечисленное выше.
Это определение, как я понял, как работает fix:
fix :: (a -> a) -> a
fix f = f (fix f)
Итак, у меня есть два вопроса:
- Как x когда-либо понимается исправление x в первом определении?
- Есть ли преимущество в использовании первого определения над вторым?