Я вообще не утверждаю, что понимаю это, но если это кому-то поможет ... тогда ура.
Рассмотрим определение 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 error
ghci и почувствовать себя хорошо».