为什么在F#Interactive中打印5000个数字会导致StackOverflowException?

时间:2014-12-11 21:25:24

标签: f# f#-interactive

在Windows 7上的F#3.1上测试

  

fsi.PrintLength< - 5000 ;;

     

[1..5000] ;;

     

由于StackOverflowException,进程终止。   检测到会话终止。按Enter键重新启动。

单声道(F#4.0),似乎没有这样的限制。

1 个答案:

答案 0 :(得分:8)

我认为这是formatting module中的一个错误,可以处理F#Interactive的漂亮打印。

有一些使用PrintLength的非尾递归函数,例如line中的boundedUnfoldLboundedUnfoldL的实现确实不是尾递归的:

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  

我不知道为什么它不会爆炸Mono。如果Mono上的F#Interactive可以处理长度&gt;那将是令人惊讶的。 5000成功。

您可以将此报告为https://visualfsharp.codeplex.com/workitem/list/basic的错误。