F# - Mono 崩溃/returns 不一致
F# - Mono crashes/ returns inconsistent
我正在尝试学习 F#,并且我有一些标准 ML 背景。我正在研究将其代码转换为 F# 的文本 "Functional Approach to Programming"。下面提供的代码示例来自上述书籍。
SML
datatype 'a genTree = GenNode of 'a * ('a genTree list);;
val tree: string genTree =
GenNode("a", [GenNode("b", []),
GenNode("c", [GenNode("d", []),
GenNode("e", [])]),
GenNode("f", [])]);;
fun map f [] = []
| map f (l::ls) = (f l) :: (map f ls);;
fun foldl f e [] = e
| foldl f e (l::ls) = foldl f (f(e, l)) ls;;
fun sigma xs = foldl (op +) 0 xs;;
fun genSize (GenNode(_, ls)) =
1 + sigma (map genSize ls);;
SML>genSize 树 (* returns 6: int *)
尝试一 - 在 F# Interactive Shell F# 3.1 中(这个会导致 shell 崩溃)
type genTree<'a> = GenNode of 'a * genTree<'a> list;;
let tree: string genTree =
GenNode("a", [GenNode("b", []);
GenNode("c", [GenNode("d", []);
GenNode("e", [])]);
GenNode("f", [])]);;
let rec map f ls =
match ls with
| [] -> []
| (l::ls) -> (f l) :: (map f ls);;
let rec foldl f e ls =
match ls with
| [] -> e
| (l::ls) -> foldl f (f e l) ls;;
let sigma ls = foldl ( + ) 0 ls;;
let rec genSize (GenNode(lbl, ls)) =
1 + sigma(map genSize ls);;
尝试二 - 在 F# Interactive Shell F# 3.1 中(为 genSize 提供一个基本案例,希望它能成功!)
这是 genSize 的新定义,尝试 #1 中的其余代码保持不变。
let rec genSize (t: genTree<'a>) =
match t with
| GenNode(_, []) -> 1
| GenNode(_, ls) -> 1 + sigma (map genSize ls);;
FSI> genSize 树 = 5
尝试三 - 在 MonoDevelop 5.9.4 中
将尝试 2 中的代码复制到 MonoDevelop 5.9.4 中,然后 运行 在那里正确地 returns 6.
问题:
有人可以向我解释是什么导致了尝试 1 - 3 之间的差异吗?
非常感谢和亲切的问候。
PS:由于我目前正在学习 F# 和函数式编程,我倾向于将大部分库功能作为学习过程的一部分。
尝试 1 的堆栈轨迹
- 断言 sgen-alloc.c:460,不满足条件“*p == NULL”
堆栈跟踪:
在 <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_specific (intptr) <0xffffffff>
在 FSI_0002.DEL.sigma (Microsoft.FSharp.Collections.FSharpList1<int>) <0x00013>
at FSI_0002.DEL.genSize<a> (FSI_0002.DEL/genTree
1) <0x0005f>
在 FSI_0002.DEL/genSize@51.Invoke (FSI_0002.DEL/genTree1<a>) <0x00023>
at FSI_0002.DEL.map<FSI_0002.DEL/genTree
1, int> (Microsoft.FSharp.Core.FSharpFunc2<FSI_0002.DEL/genTree
1, int>,Microsoft.FSharp.Collections.FSharpList1<FSI_0002.DEL/genTree
1>) <0x00032>
在 FSI_0002.DEL.genSize (FSI_0002.DEL/genTree1<a>) <0x00056>
at <StartupCode$FSI_0004>.$FSI_0004.main@ () <0x0001b>
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>
at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0xffffffff>
at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000c0>
at System.MonoType.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,string[]) <0x0039a>
at System.Reflection.Emit.TypeBuilder.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,string[]) <0x00066>
at System.Type.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Globalization.CultureInfo) <0x0005a>
at Microsoft.FSharp.Compiler.AbstractIL.ILRuntimeWriter/execEntryPtFun@1986-1.Invoke (Microsoft.FSharp.Core.Unit) <0x00083>
at Microsoft.FSharp.Compiler.Interactive.Shell/clo@883-37.Invoke (Microsoft.FSharp.Core.FSharpFunc
2,Microsoft.FSharp.Collections.FSharpList`1) <0x00038>
在 Microsoft.FSharp.Collections.ListModule.Iterate (Microsoft.FSharp.Core.FSharpFunc`2,Microsoft.FSharp.Collections.FSharpList`1) <0x00027>
在 Microsoft.FSharp.Compiler.Interactive.Shell.arg10@882 (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler,Microsoft.FSharp.Collections.FSharpList`1>>,Microsoft.FSharp.Core.Unit) <0x0005b>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler.ProcessInputs (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Collections.FSharpList1<Microsoft.FSharp.Compiler.Ast/ParsedInput>,bool,bool,bool,Microsoft.FSharp.Collections.FSharpList
1) <0x006e3>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler.EvalParsedDefinitions (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,bool,bool,Microsoft.FSharp.Collections.FSharpList1<Microsoft.FSharp.Compiler.Ast/SynModuleDecl>) <0x001db>
at Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler.EvalParsedExpression (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Compiler.Ast/SynExpr) <0x0005f>
at Microsoft.FSharp.Compiler.Interactive.Shell/clo@1590-45.Invoke (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x012ef>
at Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.InteractiveCatch<a> (Microsoft.FSharp.Core.FSharpFunc
22>,a) <0x00039>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.ExecInteraction (bool,Microsoft.FSharp.Compiler.Build/TcConfig,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Compiler.Ast/ParsedFsiInteraction) <0x00067>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.ExecInteractions (bool,Microsoft.FSharp.Compiler.Build/TcConfig,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Core.FSharpOption1) <0x005fb>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.MainThreadProcessParsedInteraction (bool,Microsoft.FSharp.Core.FSharpOption1<Microsoft.FSharp.Compiler.Ast/ParsedFsiInteraction>,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x0013b>
at Microsoft.FSharp.Compiler.Interactive.Shell/res@1782.Invoke (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x00033>
at Microsoft.FSharp.Compiler.Interactive.Shell/runCodeOnMainThread@2021-2.Invoke (Microsoft.FSharp.Core.Unit) <0x0003b>
at <StartupCode$FSharp-Compiler-Interactive-Settings>.$Fsiaux/Microsoft-FSharp-Compiler-Interactive-IEventLoop-Invoke@47.Invoke (Microsoft.FSharp.Core.Unit) <0x0001a>
at <StartupCode$FSharp-Compiler-Interactive-Settings>.$Fsiaux/run@38-4.Invoke (Microsoft.FSharp.Core.FSharpFunc
2) <0x00039>
在 Microsoft.FSharp.Primitives.Basics.List.iter (Microsoft.FSharp.Core.FSharpFunc2<T, Microsoft.FSharp.Core.Unit>,Microsoft.FSharp.Collections.FSharpList
1) <0x00038>
在 Microsoft.FSharp.Collections.ListModule.Iterate (Microsoft.FSharp.Core.FSharpFunc2<T, Microsoft.FSharp.Core.Unit>,Microsoft.FSharp.Collections.FSharpList
1) <0x00027>
在 .$Fsiaux.run@35 (Microsoft.FSharp.Compiler.Interactive.SimpleEventLoop,Microsoft.FSharp.Core.Unit) <0x000d3>
在 Microsoft.FSharp.Compiler.Interactive.SimpleEventLoop.Microsoft-FSharp-Compiler-Interactive-IEventLoop-运行 () <0x0001f>
在 Microsoft.FSharp.Compiler.Interactive.Shell.运行Loop@2066 (Microsoft.FSharp.Compiler.Interactive.Shell/FsiConsoleOutput,Microsoft.FSharp.Core.Unit) <0x00205>
在 Microsoft.FSharp.Compiler.Interactive.Shell.DriveFsiEventLoop (Microsoft.FSharp.Compiler.Interactive.Shell/FsiConsoleOutput) <0x0001b>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiEvaluationSession.运行 () <0x00bfb>
在 Microsoft.FSharp.Compiler.Interactive.Shell.evaluateSession@2382(字符串[],Microsoft.FSharp.Core.Unit)<0x0009b>
在 Microsoft.FSharp.Compiler.Interactive.Shell.MainMain (string[]) <0x00123>
在 Microsoft.FSharp.Compiler.Interactive.Main.FsiMain (string[]) <0x00013>
在(包装器 运行time-invoke).runtime_invoke_int_object(对象、intptr、intptr、intptr)<0xffffffff>
本机堆栈跟踪:
mono() [0x8102a23]
[0xb775240c]
[0xb7752424]
/lib/i386-linux-gnu/libc.so.6(gsignal+0x47) [0xb7545607]
/lib/i386-linux-gnu/libc.so.6(abort+0x143) [0xb7548a33]
mono() [0x827b381]
mono() [0x827b508]
mono() [0x827b5a3]
mono() [0x8233338]
mono() [0x8233a4c]
mono() [0x81f20a8]
mono(mono_object_new_alloc_specific+0x40) [0x81f6570]
mono(mono_object_new_specific+0x88) [0x81f6628]
[0xb725cc71]
[0xb25a974c]
[0xb25a9640]
[0xb25a9724]
[0xb25a96c3]
[0xb25a9637]
[0xb25a94ac]
[0xb725b5f7]
mono() [0x80723d1]
来自 gdb 的调试信息:
无法附加到进程。如果您的 uid 与目标的 uid 匹配
进程,检查 /proc/sys/kernel/yama/ptrace_scope 的设置,或尝试
再次作为 root 用户。有关详细信息,请参阅 /etc/sysctl.d/10-ptrace.conf
ptrace:不允许的操作。
没有话题。
============================================= ====================
执行本机代码时收到 SIGABRT。这通常表明
单声道 运行 时间或本机库之一
中的致命错误
由您的应用程序使用。
已中止
看起来像一个单声道错误。我在 VS2013 和 VS2015 中都进行了测试,您的代码工作正常。如果您可以获取堆栈跟踪,我会向 Mono 人员提交错误。
我得到了和你一样的堆栈跟踪。 Mono版本的记录是
Mono JIT compiler version 4.0.2 ((detached/c99aa0c Thu Jun 11 18:53:01 EDT 2015)
如果你 Google "Assertion at sgen-alloc.c:460, condition `*p == NULL' not met" 你会看到一些关于 Mono 错误的引用。
编辑:在 Mono 4.0.3 上测试过,它有同样的问题。有趣的是,如果你让 genTree 像
这样的非泛型
type genTree = GenNode of string * genTree list
效果很好。
我正在尝试学习 F#,并且我有一些标准 ML 背景。我正在研究将其代码转换为 F# 的文本 "Functional Approach to Programming"。下面提供的代码示例来自上述书籍。
SML
datatype 'a genTree = GenNode of 'a * ('a genTree list);;
val tree: string genTree =
GenNode("a", [GenNode("b", []),
GenNode("c", [GenNode("d", []),
GenNode("e", [])]),
GenNode("f", [])]);;
fun map f [] = []
| map f (l::ls) = (f l) :: (map f ls);;
fun foldl f e [] = e
| foldl f e (l::ls) = foldl f (f(e, l)) ls;;
fun sigma xs = foldl (op +) 0 xs;;
fun genSize (GenNode(_, ls)) =
1 + sigma (map genSize ls);;
SML>genSize 树 (* returns 6: int *)
尝试一 - 在 F# Interactive Shell F# 3.1 中(这个会导致 shell 崩溃)
type genTree<'a> = GenNode of 'a * genTree<'a> list;;
let tree: string genTree =
GenNode("a", [GenNode("b", []);
GenNode("c", [GenNode("d", []);
GenNode("e", [])]);
GenNode("f", [])]);;
let rec map f ls =
match ls with
| [] -> []
| (l::ls) -> (f l) :: (map f ls);;
let rec foldl f e ls =
match ls with
| [] -> e
| (l::ls) -> foldl f (f e l) ls;;
let sigma ls = foldl ( + ) 0 ls;;
let rec genSize (GenNode(lbl, ls)) =
1 + sigma(map genSize ls);;
尝试二 - 在 F# Interactive Shell F# 3.1 中(为 genSize 提供一个基本案例,希望它能成功!)
这是 genSize 的新定义,尝试 #1 中的其余代码保持不变。
let rec genSize (t: genTree<'a>) =
match t with
| GenNode(_, []) -> 1
| GenNode(_, ls) -> 1 + sigma (map genSize ls);;
FSI> genSize 树 = 5
尝试三 - 在 MonoDevelop 5.9.4 中
将尝试 2 中的代码复制到 MonoDevelop 5.9.4 中,然后 运行 在那里正确地 returns 6.
问题:
有人可以向我解释是什么导致了尝试 1 - 3 之间的差异吗?
非常感谢和亲切的问候。
PS:由于我目前正在学习 F# 和函数式编程,我倾向于将大部分库功能作为学习过程的一部分。
尝试 1 的堆栈轨迹
- 断言 sgen-alloc.c:460,不满足条件“*p == NULL”
堆栈跟踪:
在 <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_specific (intptr) <0xffffffff>
在 FSI_0002.DEL.sigma (Microsoft.FSharp.Collections.FSharpList1<int>) <0x00013>
at FSI_0002.DEL.genSize<a> (FSI_0002.DEL/genTree
1) <0x0005f>
在 FSI_0002.DEL/genSize@51.Invoke (FSI_0002.DEL/genTree1<a>) <0x00023>
at FSI_0002.DEL.map<FSI_0002.DEL/genTree
1, int> (Microsoft.FSharp.Core.FSharpFunc2<FSI_0002.DEL/genTree
1, int>,Microsoft.FSharp.Collections.FSharpList1<FSI_0002.DEL/genTree
1>) <0x00032>
在 FSI_0002.DEL.genSize (FSI_0002.DEL/genTree1<a>) <0x00056>
at <StartupCode$FSI_0004>.$FSI_0004.main@ () <0x0001b>
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <0xffffffff>
at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Reflection.MonoMethod.InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) <0xffffffff>
at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <0x000c0>
at System.MonoType.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,string[]) <0x0039a>
at System.Reflection.Emit.TypeBuilder.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Reflection.ParameterModifier[],System.Globalization.CultureInfo,string[]) <0x00066>
at System.Type.InvokeMember (string,System.Reflection.BindingFlags,System.Reflection.Binder,object,object[],System.Globalization.CultureInfo) <0x0005a>
at Microsoft.FSharp.Compiler.AbstractIL.ILRuntimeWriter/execEntryPtFun@1986-1.Invoke (Microsoft.FSharp.Core.Unit) <0x00083>
at Microsoft.FSharp.Compiler.Interactive.Shell/clo@883-37.Invoke (Microsoft.FSharp.Core.FSharpFunc
2,Microsoft.FSharp.Collections.FSharpList`11<Microsoft.FSharp.Compiler.Ast/ParsedInput>,bool,bool,bool,Microsoft.FSharp.Collections.FSharpList
1) <0x006e3>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler.EvalParsedDefinitions (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,bool,bool,Microsoft.FSharp.Collections.FSharpList1<Microsoft.FSharp.Compiler.Ast/SynModuleDecl>) <0x001db>
at Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompiler.EvalParsedExpression (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Compiler.Ast/SynExpr) <0x0005f>
at Microsoft.FSharp.Compiler.Interactive.Shell/clo@1590-45.Invoke (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x012ef>
at Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.InteractiveCatch<a> (Microsoft.FSharp.Core.FSharpFunc
22>,a) <0x00039>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.ExecInteraction (bool,Microsoft.FSharp.Compiler.Build/TcConfig,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Compiler.Ast/ParsedFsiInteraction) <0x00067>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.ExecInteractions (bool,Microsoft.FSharp.Compiler.Build/TcConfig,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState,Microsoft.FSharp.Core.FSharpOption1) <0x005fb>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiInteractionProcessor.MainThreadProcessParsedInteraction (bool,Microsoft.FSharp.Core.FSharpOption1<Microsoft.FSharp.Compiler.Ast/ParsedFsiInteraction>,Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x0013b>
at Microsoft.FSharp.Compiler.Interactive.Shell/res@1782.Invoke (Microsoft.FSharp.Compiler.Interactive.Shell/FsiDynamicCompilerState) <0x00033>
at Microsoft.FSharp.Compiler.Interactive.Shell/runCodeOnMainThread@2021-2.Invoke (Microsoft.FSharp.Core.Unit) <0x0003b>
at <StartupCode$FSharp-Compiler-Interactive-Settings>.$Fsiaux/Microsoft-FSharp-Compiler-Interactive-IEventLoop-Invoke@47.Invoke (Microsoft.FSharp.Core.Unit) <0x0001a>
at <StartupCode$FSharp-Compiler-Interactive-Settings>.$Fsiaux/run@38-4.Invoke (Microsoft.FSharp.Core.FSharpFunc
2) <0x00039>
在 Microsoft.FSharp.Primitives.Basics.List.iter (Microsoft.FSharp.Core.FSharpFunc2<T, Microsoft.FSharp.Core.Unit>,Microsoft.FSharp.Collections.FSharpList
1) <0x00038>
在 Microsoft.FSharp.Collections.ListModule.Iterate (Microsoft.FSharp.Core.FSharpFunc2<T, Microsoft.FSharp.Core.Unit>,Microsoft.FSharp.Collections.FSharpList
1) <0x00027>
在 .$Fsiaux.run@35 (Microsoft.FSharp.Compiler.Interactive.SimpleEventLoop,Microsoft.FSharp.Core.Unit) <0x000d3>
在 Microsoft.FSharp.Compiler.Interactive.SimpleEventLoop.Microsoft-FSharp-Compiler-Interactive-IEventLoop-运行 () <0x0001f>
在 Microsoft.FSharp.Compiler.Interactive.Shell.运行Loop@2066 (Microsoft.FSharp.Compiler.Interactive.Shell/FsiConsoleOutput,Microsoft.FSharp.Core.Unit) <0x00205>
在 Microsoft.FSharp.Compiler.Interactive.Shell.DriveFsiEventLoop (Microsoft.FSharp.Compiler.Interactive.Shell/FsiConsoleOutput) <0x0001b>
在 Microsoft.FSharp.Compiler.Interactive.Shell/FsiEvaluationSession.运行 () <0x00bfb>
在 Microsoft.FSharp.Compiler.Interactive.Shell.evaluateSession@2382(字符串[],Microsoft.FSharp.Core.Unit)<0x0009b>
在 Microsoft.FSharp.Compiler.Interactive.Shell.MainMain (string[]) <0x00123>
在 Microsoft.FSharp.Compiler.Interactive.Main.FsiMain (string[]) <0x00013>
在(包装器 运行time-invoke).runtime_invoke_int_object(对象、intptr、intptr、intptr)<0xffffffff>
本机堆栈跟踪:
mono() [0x8102a23]
[0xb775240c]
[0xb7752424]
/lib/i386-linux-gnu/libc.so.6(gsignal+0x47) [0xb7545607]
/lib/i386-linux-gnu/libc.so.6(abort+0x143) [0xb7548a33]
mono() [0x827b381]
mono() [0x827b508]
mono() [0x827b5a3]
mono() [0x8233338]
mono() [0x8233a4c]
mono() [0x81f20a8]
mono(mono_object_new_alloc_specific+0x40) [0x81f6570]
mono(mono_object_new_specific+0x88) [0x81f6628]
[0xb725cc71]
[0xb25a974c]
[0xb25a9640]
[0xb25a9724]
[0xb25a96c3]
[0xb25a9637]
[0xb25a94ac]
[0xb725b5f7]
mono() [0x80723d1]
来自 gdb 的调试信息:
无法附加到进程。如果您的 uid 与目标的 uid 匹配 进程,检查 /proc/sys/kernel/yama/ptrace_scope 的设置,或尝试 再次作为 root 用户。有关详细信息,请参阅 /etc/sysctl.d/10-ptrace.conf ptrace:不允许的操作。 没有话题。
============================================= ==================== 执行本机代码时收到 SIGABRT。这通常表明 单声道 运行 时间或本机库之一
中的致命错误由您的应用程序使用。
已中止
看起来像一个单声道错误。我在 VS2013 和 VS2015 中都进行了测试,您的代码工作正常。如果您可以获取堆栈跟踪,我会向 Mono 人员提交错误。
我得到了和你一样的堆栈跟踪。 Mono版本的记录是
Mono JIT compiler version 4.0.2 ((detached/c99aa0c Thu Jun 11 18:53:01 EDT 2015)
如果你 Google "Assertion at sgen-alloc.c:460, condition `*p == NULL' not met" 你会看到一些关于 Mono 错误的引用。
编辑:在 Mono 4.0.3 上测试过,它有同样的问题。有趣的是,如果你让 genTree 像
这样的非泛型type genTree = GenNode of string * genTree list
效果很好。