繁体   English   中英

无效的IL代码 - F#

[英]Invalid IL Code - F#

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

我收到来自Mono(在Mac上运行)的错误。

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

System.InvalidProgramException: Invalid IL code in FSI_0010:calcPowerSet (Microsoft.FSharp.Collections.List`1,Microsoft.FSharp.Collections.List`1): IL_005d: stind.r4  


  at FSI_0010.calcPowerSet[Int32] (Microsoft.FSharp.Collections.List`1 _arg1_0, Microsoft.FSharp.Collections.List`1 _arg1_1) [0x00000] 
  at .$FSI_0011._main () [0x00000] 
  at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&)
  at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] 
stopped due to error

码:

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

我不知道为什么它不起作用(我得到了相同的结果),但如果你把它重写为:

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(英特尔)下使用Mono 2.4和F#1.9.6.2可以正常工作

仅供参考,F#团队知道这个错误,这是Mono团队所知道的Mono 2.4中的一个错误(dunno,如果已经修复)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM