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 x
definiert ist als f x
. Aber denken Sie eine Minute darüber nach.
x = f x
Da x = fx, können wir den Wert von x
auf 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 f
eine Art Struktur zu generieren, damit ein späteres f
Muster 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 -> b
mit anderen Worten , (b -> b) -> (b -> b)
. Das können wir also sagen a = (b -> b)
. Auf diese Weise übernimmt fix unsere Funktion, die a -> a
oder wirklich ist (b -> b) -> (b -> b)
, und gibt ein Ergebnis vom Typ zurück a
, mit anderen Worten, b -> b
mit 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 fix
beigebracht, wie man rekursiv arbeitet.
Erinnern Sie sich, wie ich sagte, f
dass eine Art Struktur erzeugt werden muss, damit ein späteres f
Muster übereinstimmen und enden kann? Nun, das ist nicht genau richtig, denke ich. TomMD hat gezeigt, wie wir erweitern können, x
um 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 in
Teil der gesamten Definition von fix
schließlich nicht mehr in Bezug auf definiert, x
und dann ist er berechenbar und vollständig.
fix error
ghci eingeben und sich gut fühlen können."