2009-05-08 12 views
4

Ich bin neu in F # und versuche eine Funktion zu schreiben, die ein Powerset berechnet.Ungültiger IL-Code - F #

Ich erhalte einen Fehler von Mono (läuft dies auf einem Mac), der unten ist.

Zum Beispiel würde ich calcPowerSet ([1; 2; 3], []) übergeben, um die Funktion zu starten. Irgendwelche Ideen zur Lösung des Problems?

 
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 

Code:

 
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

Welche Version von F #? (z. B. 1.9.6.2) – Brian

+0

FYI - Unter 1.9.6.2 unter Windows funktioniert Ihre Funktion wie erwartet. – Brian

+0

Interessant. Ich benutze F # 1.9.4.19 Ich werde auf einer Windows-Maschine versuchen. Könnte das ein Mono-Implementierungsproblem sein? – Ipster

Antwort

2

Ich habe keine Ahnung, warum es nicht (ich habe das gleiche Ergebnis) funktioniert, aber wenn Sie es umschreiben als:

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 

es scheint funktionieren gut unter Mac (Intel) mit Mono 2.4 und F # 1.9.6.2

+0

(siehe meine Kommentare in den Kommentaren der Frage) Ich ändere meine Funktion mit einer inneren Funktion wie Johans Methode und es funktioniert. Siehe die Änderungen hier: http://pastebin.com/m6ec637a7 – phi

+0

Ja, hat auch für mich gearbeitet. – Ipster

2

FYI, stellt sich heraus, die F # -Team ist dieser Bug bekannt, es ist ein Fehler in Mono 2.4, dass Mo kein Team ist sich dessen bewusst (auch wenn es noch nicht behoben wurde).

+0

Gut zu wissen - gibt es ein Bug-Forum dafür, damit ich seinen Fortschritt verfolgen kann? – Ipster

+0

Eine schnelle Websuche findet https://bugzilla.novell.com/show_bug.cgi?id = 419828 – Brian

+0

Noch immer über F # und Mono Bugs, ich erinnere mich an einen Beitrag im Flying Frog Consultancy Blog, der bewies, dass ab Version 2.2 der Mono - Tail Rekursion noch nicht ausreichend unterstützt wurde und zu Speicherverlusten führte (weiß nicht Wie ist die Situation jetzt, da ich nicht mono). – em70

Verwandte Themen