Does the ML (SML/F#) implementations of tco in these languages differ substantially from the implementation in other languages, such as C++ and Haskell?
Non per quanto ne so, no. L'ottimizzazione di scartare lo stack esistente anziché salvare il suo stato corrente (e possibilmente regolare direttamente il puntatore di esecuzione) sull'ultima chiamata di funzione nello stack corrente è comune tra le lingue. Potrebbero esserci dei dettagli, dal momento che Haskell funziona pigramente potrebbe richiedere passaggi aggiuntivi, ma le implementazioni non differiscono sostanzialmente dal momento che l'assembly sottostante non differisce affatto.
La differenza è il livello di garanzia fornito dalla specifica della lingua e / o dall'implementazione della lingua. Per le lingue funzionali, c'è spesso una garanzia più strong (fornirà sempre TCO, fornirà TCO in caso di ricorsione reciproca), poiché avere uno stack sempre crescente per alcune strutture comuni renderebbe tale linguaggio / implementazione effettivamente inutile. Le lingue non funzionali spesso non forniscono alcuna garanzia, o qualche debole garanzia (può fornire TCO se ne abbiamo voglia) poiché ci sono alternative comuni che non fanno crescere lo stack.