Я вообще не утверждаю, что понимаю это, но если это кому-то поможет ... тогда ура.
Рассмотрим определение fix. fix f = let x = f x in x. Ошеломляющая часть - это то, что xопределяется как f x. Но подумайте об этом на минуту.
x = f x
Поскольку x = fx, то мы можем подставить значение xв правую часть этого, верно? И поэтому...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Таким образом, трюк состоит в том, что для завершения fнеобходимо сгенерировать какую-то структуру, чтобы более поздний fвариант мог сопоставить эту структуру с шаблоном и завершить рекурсию, фактически не заботясь о полном «значении» его параметра (?)
Если, конечно, вы не хотите создать бесконечный список, как проиллюстрировал Луки.
Факториальное объяснение TomMD хорошее. Подпись типа исправления (a -> a) -> a. Тип подписи для (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)это (b -> b) -> b -> b, другими словами, (b -> b) -> (b -> b). Так что мы можем так сказать a = (b -> b). Таким образом, fix принимает нашу функцию, которая есть a -> aили действительно, (b -> b) -> (b -> b)и возвращает результат типа a, другими словами, b -> bдругими словами, другую функцию!
Подождите, я думал, он должен возвращать фиксированную точку ... а не функцию. Ну, вроде как (поскольку функции - это данные). Вы можете представить, что это дало нам окончательную функцию для нахождения факториала. Мы дали ему функцию, которая не знает, как выполнять рекурсию (следовательно, одним из параметров для нее является функция, используемая для рекурсии), и fixнаучили ее, как выполнять рекурсию.
Помните, как я сказал, что fэто должно создать какую-то структуру, чтобы более поздняя fверсия могла соответствовать шаблону и завершаться? Думаю, это не совсем так. TomMD проиллюстрировал, как мы можем расширить, xчтобы применить функцию и перейти к базовому случаю. Для своей функции он использовал if / then, что и вызывает завершение. После повторных замен inчасть всего определения в fixконечном итоге перестает определяться в терминах, xи именно тогда она становится вычислимой и полной.
fix errorghci и почувствовать себя хорошо».