2016-04-17 17 views
0

I Differenzlisten wurde untersucht, und fand die DList TypHaskell Differenzlisten und Punkt freie Funktion

newtype DList a = DL { unDL :: [a] -> [a] } 

und die Funktion

dlToList :: DList a -> [a] 
dlToList = ($[]) . unDL 

Ich frage mich, was der nicht Punkt freie Version der Funktion ist und was macht ($[])?

Antwort

2

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`[]) 

+0

Auch können Sie mir erklären, wie funktioniert das funktioniert? 'emptyDL :: DList a' ' emptyDL = DL id' –

+0

Die leere Differenzliste ist diejenige Listenvorbereitungsfunktion, die, wenn sie die (leere) Terminatorliste passiert, dieselbe Liste als Ergebnis liefert. – leftaroundabout

+0

Aber wenn wir uns die Typen 'DL :: ([a] -> [a]) -> DList a' und' id :: a -> a' ansehen –