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