Простая функция append, подобная этой (в F #):
let rec app s t =
match s with
| [] -> t
| (x::ss) -> x :: (app ss t)
будет сбой, когда s станет большим, так как функция не является хвостовой рекурсивной. Я заметил, что стандартная функция добавления F # не сбой с большими списками, поэтому она должна быть реализована по-разному. Поэтому я подумал: как выглядит хвостовое рекурсивное определение append? Я придумал что-то вроде этого:
let rec comb s t =
match s with
| [] -> t
| (x::ss) -> comb ss (x::t)
let app2 s t = comb (List.rev s) t
который работает, но выглядит довольно странно. Есть ли более элегантное определение?