OK, ich gebe es eine Chance. Fühlen Sie sich frei, mich zu korrigieren, weil ich kein Experte darin bin.
Für beliebige x
und xs
muss es sein, dass toList (\c n -> c x xs)
zu einer Laufzeit reduziert, die x : toList xs
umwandelbar ist.
Dies ist nur möglich, wenn wir die linke Seite zu c x xs
reduzieren, indem (\c n -> c x xs)
einige c
und n
zu Anwendung. Also toList ~ (\f -> f ? ?)
. (Übrigens, das ist der Teil, an dem ich nicht an ein schönes strenges Argument denken konnte; ich hatte einige Ideen, aber keine sehr nette. Ich wäre glücklich, Tipps zu hören).
Jetzt muss es der Fall sein, dass c x xs ~ (x : toList xs)
. Aber da x
und xs
unterschiedliche universelle Variablen sind, und sie die einzigen Variablen sind, die auf der rechten Seite vorkommen, ist die Gleichung in Miller's pattern fragment und daher ist c ~ (\x xs -> x : toList xs)
ihre allgemeinste Lösung.
So muss toList
auf (\f -> f (\x xs -> x : toList xs) n)
für einige n
reduzieren. Natürlich kann toList
keine normale Form haben, da wir das rekursive Vorkommen immer entfalten können.
Für diese spezifische Liste, ja es existiert. Aber du meinst sicherlich eine Funktion, die beliebig viele Listen beliebig lange aufnehmen kann und eine Standardliste zurückgibt, oder? – chi
Ja, das meine ich. – MaiaVictor
Sollte es nicht '\ c n -> c 3 (\ c n -> n)' am Ende der Liste sein? –