Eu não alego entender isso de forma alguma, mas se isso ajudar alguém ... então uau.
Considere a definição de fix. fix f = let x = f x in x. A parte incompreensível é que xé definido como f x. Mas pense nisso por um minuto.
x = f x
Como x = fx, então podemos substituir o valor de xno lado direito disso, certo? Portanto ...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Portanto, o truque é, para encerrar, fdeve gerar algum tipo de estrutura, de modo que um fpadrão posterior possa corresponder a essa estrutura e encerrar a recursão, sem realmente se preocupar com o "valor" completo de seu parâmetro (?)
A menos, é claro, que você queira fazer algo como criar uma lista infinita, como ilustrou luqui.
A explicação fatorial de TomMD é boa. A assinatura de tipo de Fix é (a -> a) -> a. A assinatura de tipo para (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)é (b -> b) -> b -> b, em outras palavras (b -> b) -> (b -> b),. Então podemos dizer isso a = (b -> b). Dessa forma, fix pega nossa função, que é a -> a, ou realmente, (b -> b) -> (b -> b)e vai retornar um resultado do tipo a, ou seja, b -> bou seja, outra função!
Espere, pensei que deveria retornar um ponto fixo ... não uma função. Bem, é verdade, mais ou menos (já que funções são dados). Você pode imaginar que nos deu a função definitiva de encontrar um fatorial. Demos a ela uma função que não sabe como recursar (portanto, um dos parâmetros para ela é uma função usada para recursar), e fixensinamos como recursar.
Lembra que eu disse que isso ftem que gerar algum tipo de estrutura para que um fpadrão posterior possa combinar e terminar? Bem, isso não é exatamente certo, eu acho. TomMD ilustrou como podemos expandir xpara aplicar a função e avançar em direção ao caso base. Para sua função, ele usou um if / then, e é isso que causa a rescisão. Após substituições repetidas, a inparte de toda a definição de fixeventualmente deixa de ser definida em termos de xe é quando é computável e completa.
fix errorghci e se sentir bem consigo mesmo".