将具有多个参数的 F# 函数转换为 Func 类型 - MathNet.Numerics
Converting an F# Function with multiple parameters to a Func Type - MathNet.Numerics
在这个问题中:In F# how can I produce an expression with a type of Func<obj>?表明单值 lambda 表达式自动 cast/converted 为 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))
这表明问题不在于函数类型之间的转换,而在于使用具有错误元数的函数。我应该从您的原始错误消息中看到这一点!
在这个问题中:In F# how can I produce an expression with a type of Func<obj>?表明单值 lambda 表达式自动 cast/converted 为 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))
这表明问题不在于函数类型之间的转换,而在于使用具有错误元数的函数。我应该从您的原始错误消息中看到这一点!