Je ne prétends pas du tout comprendre cela, mais si cela aide quelqu'un ... alors oui.
Considérez la définition de fix. fix f = let x = f x in x. La partie ahurissante est qu'elle xest définie comme f x. Mais pensez-y une minute.
x = f x
Puisque x = fx, alors nous pouvons substituer la valeur de xsur le côté droit de cela, non? Ainsi donc...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Donc, l'astuce est, pour se terminer, fdoit générer une sorte de structure, de sorte qu'un fmodèle ultérieur puisse correspondre à cette structure et terminer la récursivité, sans se soucier réellement de la "valeur" complète de son paramètre (?)
À moins, bien sûr, que vous ne souhaitiez faire quelque chose comme créer une liste infinie, comme luqui l'a illustré.
L'explication factorielle de TomMD est bonne. La signature de type du correctif est (a -> a) -> a. La signature de type pour (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)est (b -> b) -> b -> b, autrement dit, (b -> b) -> (b -> b). Alors on peut dire ça a = (b -> b). De cette façon, fix prend notre fonction, qui est a -> a, ou vraiment, (b -> b) -> (b -> b)et retournera un résultat de type a, en d'autres termes b -> b, en d'autres termes, une autre fonction!
Attendez, je pensais que c'était censé renvoyer un point fixe ... pas une fonction. Eh bien c'est le cas, en quelque sorte (puisque les fonctions sont des données). Vous pouvez imaginer que cela nous a donné la fonction définitive pour trouver une factorielle. Nous lui avons donné une fonction qui ne sait pas comment récurer (par conséquent, l'un de ses paramètres est une fonction utilisée pour récurer) et lui avons fixappris à récurer.
Rappelez-vous comment j'ai dit que cela fdevait générer une sorte de structure pour qu'un fmodèle ultérieur puisse correspondre et se terminer? Eh bien, ce n'est pas tout à fait vrai, je suppose. TomMD a illustré comment nous pouvons développer xpour appliquer la fonction et avancer vers le cas de base. Pour sa fonction, il a utilisé un si / alors, et c'est ce qui cause la résiliation. Après des remplacements répétés, la inpartie de la définition entière de fixcesse finalement d'être définie en termes de xet c'est à ce moment-là qu'elle est calculable et complète.
fix errorghci et vous sentir bien dans votre peau."