在 F# 中使用 NLoptNet
Using NLoptNet in F#
在网上找不到 F# 中使用 NLopt 的示例,我一直在尝试将 NLoptNet 上给出的示例从 C# 转换为 F#。由于不熟悉 C# 并且对 F# 知之甚少,我一直在扼杀它。
这是我目前的情况:
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);
有什么想法吗?
此错误是由于 F# 处理优先级的方式引起的 - 添加更多括号或一些运算符以阐明应用顺序可以解决问题。
2 种可能的修复方法是
ref (System.Nullable())
或
ref <| System.Nullable()
为了完整起见,这里有第三种可能的修复方法:
let finalscore, result = solver.Optimize(initial_val)
这利用了 F# 可以将输出参数视为 return 值(在元组中)这一事实。我确信在某些情况下可能需要实际的参考单元。在最近的 F# mutable
中通常就足够了。有关讨论,请参阅:
SO Discussion 1
SO Discussion 2
在网上找不到 F# 中使用 NLopt 的示例,我一直在尝试将 NLoptNet 上给出的示例从 C# 转换为 F#。由于不熟悉 C# 并且对 F# 知之甚少,我一直在扼杀它。
这是我目前的情况:
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);
有什么想法吗?
此错误是由于 F# 处理优先级的方式引起的 - 添加更多括号或一些运算符以阐明应用顺序可以解决问题。
2 种可能的修复方法是
ref (System.Nullable())
或
ref <| System.Nullable()
为了完整起见,这里有第三种可能的修复方法:
let finalscore, result = solver.Optimize(initial_val)
这利用了 F# 可以将输出参数视为 return 值(在元组中)这一事实。我确信在某些情况下可能需要实际的参考单元。在最近的 F# mutable
中通常就足够了。有关讨论,请参阅:
SO Discussion 1
SO Discussion 2