在Windows 7上的F#3.1上测试
单声道(F#4.0),似乎没有这样的限制。fsi.PrintLength< - 5000 ;;
[1..5000] ;;
由于StackOverflowException,进程终止。 检测到会话终止。按Enter键重新启动。
答案 0 :(得分:8)
我认为这是formatting module中的一个错误,可以处理F#Interactive的漂亮打印。
有一些使用PrintLength
的非尾递归函数,例如line中的boundedUnfoldL
。 boundedUnfoldL
的实现确实不是尾递归的:
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的错误。