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 x
no 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, f
deve gerar algum tipo de estrutura, de modo que um f
padrã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 -> b
ou 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 fix
ensinamos como recursar.
Lembra que eu disse que isso f
tem que gerar algum tipo de estrutura para que um f
padrão posterior possa combinar e terminar? Bem, isso não é exatamente certo, eu acho. TomMD ilustrou como podemos expandir x
para 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 in
parte de toda a definição de fix
eventualmente deixa de ser definida em termos de x
e é quando é computável e completa.
fix error
ghci e se sentir bem consigo mesmo".