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 x
est définie comme f x
. Mais pensez-y une minute.
x = f x
Puisque x = fx, alors nous pouvons substituer la valeur de x
sur 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, f
doit générer une sorte de structure, de sorte qu'un f
modè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 fix
appris à récurer.
Rappelez-vous comment j'ai dit que cela f
devait générer une sorte de structure pour qu'un f
modè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 x
pour 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 in
partie de la définition entière de fix
cesse finalement d'être définie en termes de x
et c'est à ce moment-là qu'elle est calculable et complète.
fix error
ghci et vous sentir bien dans votre peau."