2017-08-08 130 views
4

在这样的问题:In F# how can I produce an expression with a type of Func<obj>?,示出了一个单值lambda表达式自动转换/转换为函数功能类型,然后在功能接受。具有多个参数转换的F#函数的函数功能类型 - MathNet.Numerics

我与MathNet.Numerics库工作,并可以通过集成确认此X^2介于0和10:

#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>' 
+0

尝试'乐趣(X,Y) - >',而不是'乐趣x和y - >'不是在PC上,将其转换后回答。 – CaringDev

+0

@CaringDev我有点沮丧地发现,不能正常工作,至少使用'IEnumerable.Aggregate' – TheQuickBrownFox

+0

@TheQuickBrownFox很有可能......没有做多少F#我的测试 - > C#的互动,不记得确切的情况我遇到了这最后。 – CaringDev

回答

3

您可以使用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 

UPDATE

望着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)) 

这表明,这个问题是不是与函数类型之间进行转换,但使用功能与错误的元数。我应该从你原来的错误信息中看到这个!

+0

感谢您的回复QBF。我仍然有型的问题,所以我投的一切在可能的情况: 让F2 F = System.Func <_,_>˚F 让newAnswer = BfgsSolver.Solve(A,B,(F2(乐趣(X:MathNet.Numerics。 LinearAlgebra.Vector ) - > [| 2.0 *(x。[0] + x。[1] - 5.0) - 4.0 * x。[0] *(x。[1] - x。[0] * x。 [0] - 4); 2.0 *(x。[0] + x。[1] - 5.0)+ 2.0 *(x。[1] - x。[0] * x。[0] - 4.0)|] ):MathNet.Numerics.LinearAlgebra.Vector ) )但它仍然给我的错误。你检查你的解决方案是否有效?当我粘贴到Visual Studio中时,出现错误 – Shillington

+0

@ user2569729查看我的更新回答 – TheQuickBrownFox

+0

好的,但我最初的问题是如何使用多个参数,在您的答案中,您基本上使用了一个参数_,我的原始示例与集成函数。在我上面的回复中,我尝试使用变量转换为向量(因为我的实际问题涉及多个参数),但是这给出了其他错误...您有任何其他的建议吗? – Shillington

相关问题