Заметил то что в библиотеке Немерле, используются некоторые функции без оптимизации хвостовой рекурсии, например:
FoldRight на списке из 50000 элементов убивает стэк, это дело можно переписать с помощью continuations, но это будет чуть медленее, думаю что скажет сообщество, может сделать отдельные варианты функций но с TCO, или переписать оригинальные.
Сравнительные показатели, FoldRight c continuations:
public FoldRight[T, TOut] (this l : list [T], acc : TOut, f : T * TOut -> TOut) : TOut
{
def loop(l, cont)
{
match (l)
{
| x :: xs => loop(xs, racc => cont(f(x, racc)))
| [] => cont(acc)
}
}
loop(l, x => x)
}
в сравнении с FoldRight из библиотеки, не убивает стэк, TCO, но показатели следующие на 10000 элементов операция
def res = lst.FoldRight(0, (x, a) => x * 3 + a);
старая новая
61074 79434
61569 74705
61938 75744
62024 75350
С остальными наверное похожие показатели, что посоветует сообщество?