2014-11-10 3 views
0

У меня есть вопросы относительно F # на моно. Я занимаюсь этим курсом по функциональному программированию в своем университете. В курсе мы используем F #, и я использую Xamarin в качестве моего редактора.Проблемы оптимизации хвостовых опций F # на Mono

Дело в том, что у нас был урок по рекурсии хвоста, как инструмент для повышения эффективности. Но когда вы не можете написать хвост рекурсивной функции, нам пришлось использовать непрерывный, так что мы используем кучу, а не стек.

Это, похоже, не работает на mono 3.10.0 с F # 3.1, я получаю System.StackOverflowException. Это должно быть невозможно получить, поскольку непрерывный должен использовать кучу.

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))) 
+0

Существует некоторое указание на то, что Mono не поддерживает устранение вызова хвоста, см. [Здесь] (http://flyingfrogblog.blogspot.se/2009/01/mono-does-not-support-tail-calls.html) и [здесь] (http://stackoverflow.com/questions/9595585/what-is-the-current-state-of-tail-call-optimization-for-f-on-mono-2-11) – Christian

+0

Я думаю вы имеете в виду «проблемы продолжения» на моно (в заголовке), но я не могу точно сказать, поэтому я не буду менять название. –

+0

@OnorioCatenacci Я предполагаю, что это должно быть название что-то вроде «Проблемы оптимизации хвоста F # на Mono». Вышеприведенный код, как я понимаю, написал, чтобы использовать продолжение как средство для получения рекурсивного вызова в позиции хвоста и, таким образом, использовать TCO. – Christian

ответ

0

Я проверил реализацию Фибоначчи, проходящий аккумулятор вместо функции (продолжение), как это:

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 при использовании продолжений. В июне 2013 года есть Xamarin ticket.