c# - 将具有多个参数的 F# 函数转换为 Func 类型 - MathNet.Numerics

标签 c# f# mathematical-optimization func mathnet-numerics

在这个问题中:In F# how can I produce an expression with a type of Func<obj>?结果表明,单值 lambda 表达式会自动转换/转换为 Func 类型,然后在函数中接受。

我正在使用 MathNet.Numerics 库,可以通过在 0 到 10 之间积分 x^2 来确认这一点:

#r "../packages/MathNet.Numerics.3.20.0/lib/net40/MathNet.Numerics.dll"
#r "../packages/MathNet.Numerics.FSharp.3.20.0/lib/net40/MathNet.Numerics.FSharp.dll"

#load "Library1.fs"
open Library3

// Define your library scripting code here

open MathNet.Numerics.Integration

let integral = DoubleExponentialTransformation.Integrate((fun x -> x**2.0), 0.0, 10.0, 1.0)

val answer : float = 333.3333333

但是,我无法让它与多值函数一起使用。当我尝试这个时,我得到了一个类型错误。有谁知道解决这个问题的方法吗?

open MathNet.Numerics.Optimization
open MathNet.Numerics.LinearAlgebra.Double

let newAnswer = BfgsSolver.Solve(DenseVector[|1.0, 1.0|], 
                                 (fun x y -> (x + y - 5.0) ** 2.0 + (y - x*x - 4.0) ** 2.0), 
                                 (fun x y -> DenseVector[| 2.0 * (x + y - 5.0) - 4.0 * x * (y - x*x - 4); 
                                                           2.0 * (x + y - 5.0) + 2.0 * (y - x*x - 4.0)   |])
                                                           )

我收到以下错误...

Script.fsx(20,34): error FS0193: Type constraint mismatch. The type 
    ''a -> 'b -> 'c'    
is not compatible with type
    'System.Func<MathNet.Numerics.LinearAlgebra.Vector<float>,float>'   

最佳答案

您可以使用 System.Func<_,_,_>()像这样转换函数:

let newAnswer = BfgsSolver.Solve(DenseVector[|1.0, 1.0|], 
                                 (System.Func<_,_,_>(fun x y -> (x + y - 5.0) ** 2.0 + (y - x*x - 4.0) ** 2.0)),
                                 (System.Func<_,_,_>(fun x y ->
                                    DenseVector[| 2.0 * (x + y - 5.0) - 4.0 * x * (y - x*x - 4)
                                                  2.0 * (x + y - 5.0) + 2.0 * (y - x*x - 4.0) |])))

如果您发现自己经常需要这个,您可以使用帮助程序使代码不那么难看:

let f2 f = System.Func<_,_,_> f

更新

查看 Math.NET documentation for this method我现在看到它实际上只接受一个输入的函数。也许您对 Func<A, B> 感到困惑类型签名,但在本例中为 A是输入类型,B是输出类型。

具有一个输入的 F# 函数被转换为 Func<_,_>自动地。我下载了 Math.NET,这个非常小的例子没有给出编译错误:

open MathNet.Numerics.Optimization
open MathNet.Numerics.LinearAlgebra.Double
BfgsSolver.Solve(DenseVector [||], (fun x -> x.[0]), (fun x -> x))

这表明问题不在于函数类型之间的转换,而在于使用具有错误元数的函数。我应该从您的原始错误消息中看到这一点!

关于c# - 将具有多个参数的 F# 函数转换为 Func 类型 - MathNet.Numerics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45563696/

相关文章:

c# - IDataReader.GetName(i) 是否适用于空数据读取器?

c# - 企业库记录 block 滚动平面文件不写入文件

winforms - 关于为饼图创建标签的 F# 说明

python - 具有最小分数的作业

python - 多面体/点集中的最大内接椭圆体

c# - 在 .NET 中寻找用于并发的静态代码分析工具,如 CheckThread for java

c# - WebProxy 和 IWebProxy 与 WebClient 之间的关系是什么?

f# - 在 F# 中为脚本文件编写测试

f# - F# 中的累加器生成器

c++ - 求所有可能的点对之间力的总和?