2016-07-19 11 views
1

Nachdem ich keine Beispiele online von NLopt gefunden habe, das in F # verwendet wird, habe ich versucht, das Beispiel von NLoptNet von C# zu F # zu konvertieren. Da ich keine Ahnung von C# und sehr wenig von F # habe, habe ich es ziemlich schlecht geschlachtet.Verwendung von NLoptNet in F #

Hier ist, was ich bisher:

open NLoptNet 
open System 


let solver = new NLoptSolver(NLoptAlgorithm.LN_COBYLA, uint32(1), 0.001, 100) 
solver.SetLowerBounds([|-10.0|]) 
solver.SetUpperBounds([|100.0|]) 

let objfunc (variables : float array) = 
    Math.Pow(variables.[0] - 3.0, 2.0) + 4.0 

solver.SetMinObjective(objfunc) 

let initial_val = [|2.|] 
let finalscore = ref System.Nullable() // ERROR 
let result = solver.Optimize(initial_val, finalscore) 

Hier die Beschreibung des Fehlers ist:

Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized

Um genauer zu sein, ich versuche, die folgenden drei Zeilen zu übersetzen C# bis F #:

double? finalScore; 
var initialValue = new[] { 2.0 }; 
var result = solver.Optimize(initialValue, out finalScore); 

Irgendwelche Ideen?

+3

Ich vermute, dass 'ref (System.Nullable())' oder 'ref <| System.Nullable() 'wird Ihr Problem lösen –

+0

Terrific. Kannst du bitte als Antwort posten, damit ich das Häkchen setzen kann? Vielen Dank! –

+2

Ich frage mich, ob Sie den out-Parameter nehmen könnten, ohne eine Ref-Zelle zu erstellen. so etwas wie 'let finalcore, result = solver.Optimize (initial_val)'. – s952163

Antwort

5

Dieser Fehler ist auf die Art und Weise zurückzuführen, in der F # Vorrang hat - das Hinzufügen weiterer Klammern oder einiger Operatoren zur Klärung der Reihenfolge, in der Dinge angewendet werden, behebt das Problem.

2 mögliche Korrekturen sind

ref (System.Nullable()) 

oder

ref <| System.Nullable() 
5

Nur der Vollständigkeit halber hier noch eine dritte mögliche Lösung:

let finalscore, result = solver.Optimize(initial_val)

Dieser Vorteil der Tatsache, nimmt die F # kann den out-Parameter als Rückgabewert behandeln (in einem Tupel). Ich bin mir sicher, dass es einen Fall geben könnte, wo eine tatsächliche Ref-Zelle notwendig sein könnte. In der letzten F # mutable ist in der Regel genug. Für einige Diskussion siehe:

MSDN reference

SO Discussion 1

SO Discussion 2

Fun&Profit reference