2014-12-11 5 views
7

Getestet auf F # 3.1 auf Windows 7Warum verursacht das Drucken von 5000-Nummern in F # Interactive eine StackOverflowException?

fsi.PrintLength <-5.000 ;;

[1..5000] ;;

Der Prozess wird aufgrund von StackOverflowException beendet. Sitzungsabbruch erkannt. Drücken Sie die Eingabetaste zum Neustart

auf Mono (F # 4.0) scheint es nicht so eine Beschränkung zu geben.

+0

Klingt wie die F # Interactive profitieren würde von https://fslang.uservoice.com/forums/245727-f-language/suggestions/5663074-enable-a-compiler-warning-when-a-recursive-algorit – Asik

Antwort

8

Ich denke, das ist ein Fehler in der formatting module, die sich um schönes Drucken auf F # Interactive kümmert.

Es gibt einige nicht-tail rekursive Funktionen, die PrintLength z. in diesem line. Die Umsetzung von boundedUnfoldL ist in der Tat nicht Schwanz-rekursive:

let boundedUnfoldL 
       (itemL  : 'a -> layout) 
       (project : 'z -> ('a * 'z) option) 
       (stopShort : 'z -> bool) 
       (z : 'z) 
       maxLength = 
     let rec consume n z = 
     if stopShort z then [wordL "..."] else 
     match project z with 
      | None  -> [] // exhaused input 
      | Some (x,z) -> if n<=0 then [wordL "..."]    // hit print_length limit 
            else itemL x :: consume (n-1) z // cons recursive... 
     consume maxLength z 

Ich weiß nicht, warum es auf Mono nicht sprengen. Es wäre überraschend, wenn F # Interactive on Mono die Länge> 5000 erfolgreich bewältigen könnte.

Sie können dies als einen Fehler an https://visualfsharp.codeplex.com/workitem/list/basic melden.

+0

Vielleicht sie haben es in F # 4.0 behoben? –

Verwandte Themen