I (credo) la seguente definizione di funzione è ricorsiva in coda:I compilatori di famiglie ML fanno qualche ottimizzazione sofisticata per le chiamate tail?
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
if x > y
then false
else is_sorted (y::xs)
Banalmente, è equivalente alla seguente dichiarazione
fun is_sorted [] = true
| is_sorted [x] = true
| is_sorted (x::(y::xs)) =
(x <= y) andalso (is_sorted (y::xs))
Eppure, in questa versione l'ultimo passo è quello di applicare la 'AndAlso ', quindi non è ricorsivo alla coda. O sembrerebbe di sì, tranne che dal momento che (almeno Standard) ML (di NJ) utilizza la valutazione di cortocircuito, l'andalso è in realtà/non/l'ultimo passo. Quindi questa funzione avrebbe un'ottimizzazione di coda? O ci sono altri casi interessanti in cui una funzione ML che ovviamente non usa la ricorsione in coda viene in effetti ottimizzata?
Posso dirti che l'ultima volta che ho letto l'assembly generato da OCaml, la chiamata in 'fun x -> let r = g x in r' non è stata compilata come coda. –
Io non la penso così. Haskell risponde abbastanza pesantemente al compilatore per fare questo tipo di ottimizzazione. Ma la filosofia di OCaml è di lasciare questo livello di ottimizzazione allo sviluppatore e generalmente il suo compilatore si limita a compilare direttamente su qualsiasi cosa lo sviluppatore scriva. –
Mi sembra che la tua funzione ottenga la risposta sbagliata per la lista '[3, 4, 2, 3, 4]' –