Проблемы с оптимизацией вызовов F# на Mono
У меня есть проблемы, касающиеся F# на моно. Я делаю этот курс по функциональному программированию в моем университете. В курсе мы используем F#, а я использую Xamarin в качестве редактора.
Дело в том, что у нас был урок по хвостовой рекурсии, как инструменту повышения эффективности. Но когда вы не можете написать свою хвостовую рекурсивную функцию, нам пришлось использовать непрерывную, так что мы использовали кучу, а не стек.
Кажется, это не работает на моно 3.10.0 с F# 3.1, я получаю исключение System.StackruException. Это должно быть невозможно получить, потому что непрерывный должен использовать кучу.
let rec fibC n c =
match n with
|0 -> c 0
|1 -> c 1
|n -> fibC (n-1) (fun v1 -> fibC (n-2) (fun v2 -> c(v1+v2)))
1 ответ
Я протестировал реализацию Фибоначчи, передавая аккумулятор вместо функции (продолжение), например:
let fib n =
let rec _fib i (a,b) =
match i with
| 0 -> a
| _ -> _fib (i-1) (b, a+b)
_fib n (0,1)
который работал нормально на Mono, то есть без переполнения стека. Так что я думаю, что это проблема только с TCO при использовании продолжений. На этот счет есть билет Xamarin с июня 2013 года.