2009-05-08 12 views
4

私はF#を初めて使用しており、powersetを計算する関数を作成しようとしています。無効なILコード - F#

下記のMacでMonoからエラーが発生します。

たとえば、関数を開始するために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];; 
+0

どのバージョンのF#? (例:1.9.6.2) – Brian

+0

FYI - Windowsでは1.9.6.2で、機能は期待通りに機能します。興味深い。 – Brian

+0

私はF#1.9.4.19を使用しています 私はWindowsマシンで試してみます。これはモノラル実装の問題でしょうか? – Ipster

答えて

2

私はそれが動作しない理由はわかりません(私は同じ結果を得た)しかし、あなたのようにそれを書き換える場合:

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 

それがいるようですMono 2.4とF#1.9.6.2で

+0

(質問のコメントのコメントを参照) Johanのメソッドのような内部関数を使用して関数を変更しても機能します。ここの変更を見てください:http://pastebin.com/m6ec637a7 – phi

+0

うん、私のために働いた。 – Ipster

2

とMac(Intel)の下でうまく動作する、FYIは、F#チームがこのバグを認識していることが判明、Mono 2.4のバグですチームは認識していません(まだ修正されていない場合はdunno)。

+0

よく知っておいてください - そのバグのフォーラムはありますか? – Ipster

+0

クイックウェブ検索では、 https://bugzilla.novell.com/show_bug.cgi?id = 419828 – Brian

+0

まだF#とモノのバグについて、フライングフロッグコンサルタントのブログのポストを覚えています。これは、モノラルテール再帰のバージョン2.2ではまだ十分サポートされておらず、私はモノをしないので、今はどうですか?) – em70

関連する問題