Проблемы с оптимизацией вызовов 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 года.

Другие вопросы по тегам