このような単純な追加関数(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
これは機能しますが、かなり奇妙に見えます。よりエレガントな定義はありますか?