Ich behaupte nicht, das überhaupt zu verstehen, aber wenn das jemandem hilft ... dann yippee.
Betrachten Sie die Definition von fix. fix f = let x = f x in x. Der umwerfende Teil ist der, der xdefiniert ist als f x. Aber denken Sie eine Minute darüber nach.
x = f x
Da x = fx, können wir den Wert von xauf der rechten Seite ersetzen , richtig? Also deshalb...
x = f . f $ x -- or x = f (f x)
x = f . f . f $ x -- or x = f (f (f x))
x = f . f . f . f . f . f . f . f . f . f . f $ x -- etc.
Der Trick besteht also darin, zum Beenden feine Art Struktur zu generieren, damit ein späteres fMuster mit dieser Struktur übereinstimmen und die Rekursion beenden kann, ohne sich tatsächlich um den vollen "Wert" seines Parameters (?) Zu kümmern.
Es sei denn, Sie möchten natürlich so etwas wie eine unendliche Liste erstellen, wie Luqui illustriert.
Die faktorielle Erklärung von TomMD ist gut. Die Typensignatur von Fix lautet (a -> a) -> a. Die Typensignatur für (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)ist (b -> b) -> b -> bmit anderen Worten , (b -> b) -> (b -> b). Das können wir also sagen a = (b -> b). Auf diese Weise übernimmt fix unsere Funktion, die a -> aoder wirklich ist (b -> b) -> (b -> b), und gibt ein Ergebnis vom Typ zurück a, mit anderen Worten, b -> bmit anderen Worten, eine andere Funktion!
Warten Sie, ich dachte, es sollte einen festen Punkt zurückgeben ... keine Funktion. Nun, irgendwie (da Funktionen Daten sind). Sie können sich vorstellen, dass es uns die endgültige Funktion gab, eine Fakultät zu finden. Wir haben ihm eine Funktion gegeben, die nicht weiß, wie man rekursiv arbeitet (daher ist einer der Parameter eine Funktion, die zum Rekursieren verwendet wird), und haben ihm fixbeigebracht, wie man rekursiv arbeitet.
Erinnern Sie sich, wie ich sagte, fdass eine Art Struktur erzeugt werden muss, damit ein späteres fMuster übereinstimmen und enden kann? Nun, das ist nicht genau richtig, denke ich. TomMD hat gezeigt, wie wir erweitern können, xum die Funktion anzuwenden und zum Basisfall zu gelangen. Für seine Funktion verwendete er ein Wenn / Dann, und das ist die Ursache für die Beendigung. Nach wiederholten Ersetzungen wird der inTeil der gesamten Definition von fixschließlich nicht mehr in Bezug auf definiert, xund dann ist er berechenbar und vollständig.
fix errorghci eingeben und sich gut fühlen können."