我需要使用非常深的堆栈运行一些F#代码。这是因为Mono的理念是删除尾部调用是一种优化,因此并不总是需要工作。
我可以启动一个包含大量堆栈空间的线程,一切正常,直到我使用PSeq,它是System.Linq.ParallelEnumerable的包装器。然后一切都因堆栈溢出而死亡。我希望原因是PSeq依赖于线程使用默认堆栈大小的全局线程池。
有人可以告诉我是否有任何方法可以让PSeq使用大堆栈?非常感谢。
答案 0 :(得分:0)
显然,您可以使用editbin更改可执行文件的默认堆栈大小。请参阅How to change stack size for a .NET program?。
但请注意,许多F#尾调用都是由编译器重写的,因此运行时的作用并不重要。例如,这是F#中的函数:
let rec zeroPresent =
function
| [] -> false
| h :: t -> h = 0 || zeroPresent t
在这里它被反编译为C#。请注意while (true)
:
public static bool zeroPresent(FSharpList<int> _arg1)
{
while (true)
{
FSharpList<int> fsharpList1 = _arg1;
if (fsharpList1.get_TailOrNull() != null)
{
FSharpList<int> fsharpList2 = fsharpList1;
FSharpList<int> tailOrNull = fsharpList2.get_TailOrNull();
if (fsharpList2.get_HeadOrDefault() != 0)
_arg1 = tailOrNull;
else
goto label_3;
}
else
break;
}
return false;
label_3:
return true;
}