f# - IL 代码无效 - F#

标签 f# mono

我是 F# 的新手,我正在尝试编写一个计算幂集的函数。

我从下面的 Mono(在 Mac 上运行)收到一个错误。

例如,我会通过 calcPowerSet ([1;2;3], []) 来启动函数。关于如何解决问题的任何想法?

System.InvalidProgramException: FSI_0010:calcPowerSet 中的 IL 代码无效 (Microsoft.FSharp.Collections.List`1,Microsoft.FSharp.Collections.List`1): IL_005d:stind.r4

在 FSI_0010.calcPowerSet[Int32] (Microsoft.FSharp.Collections.List`1 _arg1_0, Microsoft.FSharp.Collections.List`1 _arg1_1) [0x00000]
在 .$FSI_0011._main () [0x00000]
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&)
在 System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] 参数, System.Globalization.CultureInfo 文化) [0x00000]
由于错误而停止

代码:

让 rec calcPowerSet = 函数
| ([], []) -> [[]]
| ((head::tail), (cHead::cTail)) ->
calcPowerSet (tail, (cHead::cTail)) @calcPowerSet (tail, (head::cHead::cTail))
| ((头::尾), []) ->
calcPowerSet(tail,[])@calcPowerSet(tail,[head])
| ([], 收集) -> [收集];;

最佳答案

我不知道为什么它不起作用(我得到了相同的结果)但是如果您将其重写为:

let calcPowerSet =
   let rec innerCalc = 
      function
      | ([], []) -> [[]]
      | ((head::tail), (cHead::cTail)) -> 
         innerCalc (tail, (cHead::cTail)) @ innerCalc (tail, (head::cHead::cTail))
      | ((head::tail), []) -> 
         innerCalc (tail, []) @ innerCalc (tail, [head])
      | ([], collect) -> [collect]
   innerCalc

它似乎在 Mac (intel) 下使用 Mono 2.4 和 F# 1.9.6.2 运行良好

关于f# - IL 代码无效 - F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837676/

相关文章:

events - 对 F# 中的事件使用react时从列表中获取下一个值

c# - NUnit/Mono 即使使用 --debug 也不打印堆栈跟踪行号

c# - Mono C# 应用程序使用 boost 组件实例化 C++ 库类

c# - Mono.Data.Sqlite 源代码在哪里?

c# - 如何将文件从 windows 复制到单声道的 mac?

用于转换多个不同度量单位的 F# 运算符重载

f# - 如何在私有(private)成员和让绑定(bind)之间进行选择?

c# - 在 Mono 和 .NET 之间拆分的编译器 #if 指令

f# - 我可以用 F# 中的索引做吗

winforms - F# : what is the deal with the flicker? 中的双缓冲