К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Подскажите плз по F#

Гость
0 - 08.03.2013 - 19:31
Пробую пример с правосторонней разверткой списка.
let a=1L;
let b=1000000L;
let list=[a..b];

let fold_right func acc list =
let rec loop list cont = //сюда мы передаем текущую функцию континуации
match list with
|[] -> cont acc //а вот и наше ключевое вычисление.
|head::tail -> loop tail (fun racc -> cont (func head racc))
loop list (fun x -> x)



let reverse = fold_right(fun _ acc -> acc + 1) 0



let sl=reverse(list);
System.Console.Write(sl);
System.Console.Read();

но поечему то вылетает с переполненеим стека, хотя такой код вреод как должне решить проблемы переполнен стека (взял тсюуда http://habrahabr.ru/post/57503/)
подскажите плз, где грабли?



Гость
1 - 21.03.2013 - 11:46
Чтобы получить хвостовую рекурсию вычисляемое выражение должно быть последним. Если после вычисляемого выражения будет хоть что-то - компилятор не сможет это оптимизировать без использования стека.


К списку вопросов






Copyright ©, Все права защищены