Der erste Schritt in einem Punkt freie Definition einer Funktion zu sehen, ist die η -Reduktion zurückzukehren:
dlToList = ($[]) . unDL
dlToList dl = (($[]) . unDL) dl
Dann starten Sie die Zusammensetzung-Kette Anwendung von rechts nach links:
dlToList dl = ($[]) (unDL dl)
Sie könnten dann den Operator Abschnitt & dagger;
dlToList dl = unDL dl $ []
Allerdings hält die ($[])
wie es tatsächlich macht Sinn, denn dies ist der wesentliche Wandler zwischen Differenzlisten und Stammlisten ist: es dauert eine [a]->[a]
-prepender-Funktion und wendet sie auf den Terminator []
, was in einer konkreten Liste.
& dolch;
Das könnten wir weiter vereinfachen: dlToList dl = unDL dl []
die, nebenbei bemerkt, könnte in kürzerer Weise punktfrei wieder hergestellt werden:
dlToList = (`unDL`[])
Auch können Sie mir erklären, wie funktioniert das funktioniert? 'emptyDL :: DList a' ' emptyDL = DL id' –
Die leere Differenzliste ist diejenige Listenvorbereitungsfunktion, die, wenn sie die (leere) Terminatorliste passiert, dieselbe Liste als Ergebnis liefert. – leftaroundabout
Aber wenn wir uns die Typen 'DL :: ([a] -> [a]) -> DList a' und' id :: a -> a' ansehen –