Hier ist eine Möglichkeit, einen binären Suchbaum flach zu machen. Sein Problem besteht darin, dass der Stapel überläuft, wenn die große Funktion, die er erstellt, schließlich auf [] angewendet wird. Ich würde gerne wissen, ob es einen vernünftigen Weg gibt, dieses Codefragment zu reparieren, ohne es komplett zu verändern. Zum Beispiel wäre es nicht hilfreich, einen benutzerdefinierten Composer zu erstellen, der eine Baumstruktur von Funktionen erstellt, und diese dann mithilfe eines expliziten Stacks auswertet (da das Problem bereits darin besteht, eine Struktur zu reduzieren).Überlauf Stapel beim Zusammenstellen von vielen Funktionen
let flatten_k t =
let rec f t (k:(list<'a>->list<'a>)->list<'a>) =
match t with
| Leaf ->
k (fun xs -> xs)
| Bin (l,x,r) ->
f l (fun fl -> f r (fun fr -> k (fl << (fun xs -> x::xs) << fr)))
f t (fun g -> g [])
Es kann sein, dass es besser ist, über ein vereinfachtes Beispiel zu denken, obwohl es schwieriger sein kann, auf eine Lösung, um überzeugend darlegt (da es nichts tut, nahe an, obwohl es zumindest die Funktion Zusammensetzung überläuft zeigt der Stapel):
let test_composition() =
let mutable f = id
for i=0 to 1000000 do
f <- id << f // >> works fine for me
printf "Functions return %d" (f 123)
Noch einmal, diese Frage geht nicht darum, wie man einen Baum flacht. Ich kann das leicht tun, wie folgt oder in irgendeiner Anzahl von rein zwingenden Mitteln. Ich möchte wissen, ob ein auf dem Akkumulieren einer großen Funktion basierender Ansatz für dieses spezielle Problem durchführbar gemacht werden kann. Danke vielmals.
let flatten t =
let rec f t acc cont =
match t with
| Leaf ->
cont acc
| Bin (l, x, r) ->
f r acc (fun rs -> f l (x::rs) cont)
f t [] id
Kompilieren Sie mit Optimierungen? Was ist deine Laufzeit? Betriebssystem? –
Ich verwende keine Optimierungen, weil ich keine Lösung möchte, die manchmal funktioniert und manchmal nicht. Ich erzeuge jedoch Tail Calls. Ich verwende .net unter Windows. Mir ist bewusst, dass Tail-Calls unter Mono nicht korrekt implementiert sind, aber das ist hier nicht das Problem. – jeremiah