1
例えば、次の関数merge
は、2つの指定された整数リストをマージするために呼び出すことができる。2つのリストを末尾再帰的にマージするには?
fun
merge
{m,n:nat}
(
xs: list(int, m)
,
ys: list(int, n)
) : list(int, m+n) =
(
case+ xs of
| list_nil() => ys
| list_cons(x, xs2) =>
(
case+ ys of
| list_nil() => xs
| list_cons(y, ys2) =>
if x <= y
then list_cons(x, merge(xs2, ys))
else list_cons(y, merge(xs, ys2))
// end of [if]
)
)
は明らかに、merge
は末尾再帰ではありません。 2つの非常に長いリストに適用すると、merge
はコールスタックをオーバーフローする可能性があります。テール再帰的にmerge
を実装する方法はありますか? stream2list_vtはテールrecusive(と非常にメモリ-質素)であることを