2016-07-19 3 views
1

F #에서 NLopt를 온라인으로 사용하는 예제를 찾지 못했습니다. NLoptNet에 제공된 예제를 C#에서 F #으로 변환하려고했습니다. C#에 익숙하지 않고 F #으로 거의 익숙하지 않아서, 나는 그것을 아주 나쁘게 도살 해왔다. 여기 F #에서 NLoptNet 사용

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) 

오류의 설명입니다 : 여기

내가 지금까지 무엇을 가지고

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

더 구체적으로, 나는 다음과 같은 세 줄을 번역하기 위해 노력하고있어 C#에서 F # :

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

아이디어가 있으십니까?

+3

내가 의심 '심판이 (선택 System.Nullable())'또는'심판 <| System.Nullable()'귀하의 문제를 해결할 것입니다 –

+0

대단한. 체크 표시를 누를 수 있도록 답변으로 게시 해 주시겠습니까? 고맙습니다! –

+2

ref 셀을 만들지 않고 out 매개 변수를 사용할 수 있는지 궁금합니다. 'final finance, result = solver.Optimize (initial_val)'와 같은 것입니다. – s952163

답변

5

이 오류는 F #이 우선 순위를 처리하는 방식으로 발생합니다. 적용되는 순서를 명확히하기 위해 대괄호 또는 일부 연산자를 추가하면 문제가 해결됩니다.

이 가능한 수정

ref (System.Nullable()) 

또는 여기를 위하여 제 3 가능한 수정 프로그램입니다 그냥 완성도

ref <| System.Nullable() 
5

있습니다

let finalscore, result = solver.Optimize(initial_val)

이 사실을 이용 소요 F #은 out 매개 변수를 반환 값 (튜플 단위)으로 처리 할 수 ​​있습니다. 실제 ref 셀이 필요한 경우가있을 수 있습니다. 최근에는 F # mutable으로 충분합니다. 논의를 참조 :

MSDN reference

SO Discussion 1

SO Discussion 2

Fun&Profit reference