2014-12-11 11 views
7

Testowane na F # 3.1 w systemie Windows 7Dlaczego drukowanie liczb 5000 w trybie F # Interactive powoduje wyjątek StackOverflowException?

fsi.PrintLength < - 5000 ;;

[1..5000] ;;

Proces został zakończony z powodu wyjątku StackOverflowException. Wykryto zakończenie sesji. Naciśnij Enter, aby ponownie uruchomić.

na Mono (F # 4.0), nie wydaje się być takim ograniczeniem.

+0

Wygląda na to, że F # Interactive skorzystałby z https://fslang.uservoice.com/forums/245727-f-language/suggestions/5663074-able-a-compiler-warning-when-a-recursive-algorit – Asik

Odpowiedz

8

Myślę, że to błąd w formatting module, który dba o ładne drukowanie do F # Interactive.

Istnieje kilka nierekultywujących funkcji rekurencyjnych, które używają np. PrintLength np. boundedUnfoldL w tym line. Realizacja boundedUnfoldL nie jest rzeczywiście ogon rekurencyjnej:

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 

Nie wiem, dlaczego nie wysadzić na Mono. Byłoby zaskakujące, gdyby F # Interactive on Mono potrafił pomyślnie obsłużyć> 5000 znaków.

Możesz zgłosić to jako błąd do https://visualfsharp.codeplex.com/workitem/list/basic.

+0

naprawili go w F # 4.0? –