I (glauben) die folgende Funktionsdefinition ist tail-rekursive:Müssen ML-Familien-Compiler raffinierte Optimierungen für Tail-Calls vornehmen?
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
if x > y
then false
else is_sorted (y::xs)
Trivialerweise ist es gleichbedeutend mit der folgenden Erklärung
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
(x <= y) andalso (is_sorted (y::xs))
Doch in dieser Version ist der letzte Schritt ist die ‚andalso anzuwenden ', so ist es nicht tail-rekursiv. Oder es scheint so zu sein, außer dass (zumindest Standard) ML (von NJ) eine Kurzschlussauswertung verwendet, ist das und ist auch tatsächlich/nicht/der letzte Schritt. Hätte diese Funktion also Tail-Call-Optimierung? Oder gibt es noch andere interessante Fälle, in denen eine ML-Funktion, die offensichtlich keine Tail-Rekursion verwendet, tatsächlich optimiert wird?
Ich kann Ihnen sagen, dass das letzte Mal, als ich die von OCaml generierte Assembly las, der Aufruf in 'fun x -> let r = gx in r' nicht als Tail-Call kompiliert wurde. –
Ich glaube nicht. Haskell antwortet ziemlich heftig auf den Compiler, um diese Art von Optimierung zu machen. Aber die Philosophie von OCaml besteht darin, diese Ebene der Optimierung dem Entwickler zu überlassen, und in der Regel kompiliert der Compiler das, was der Entwickler schreibt. –
Scheint mir, Ihre Funktion bekommt die falsche Antwort für die Liste '[3, 4, 2, 3, 4]' –