如何将F#(double - &gt; double)转换为Func <double,double =“”>?

时间:2015-04-30 08:36:53

标签: f# mathnet

我正在使用MathNet.Numerics.LinearAlgebra来构建库。我需要将一个用户指定的函数应用于矩阵的每个元素,我知道我可以使用Map

open System
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.LinearAlgebra.Double

let m1 = matrix [[1.0; 2.0; 3.0]]
let f1 = fun s -> s * 3.14
let m2 = m1.Map f1 // THIS FAILS
let m3 = m1.Map (fun s -> s * 3.14) // THIS WORKS!

m2的行中,我收到以下错误:

This expression was expected to have type Func<float, 'a> but here has type double -> double

但我需要能够传递映射函数,而不是像m3那样定义内联函数。 MathNet.Numerics的文档似乎没有解决我的问题。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

F#扩展(MathNet.Numerics.FSharp包)通常提供可以处理普通F#函数的变体。在这种情况下,您可以写:

let m2 = m1 |> Matrix.map f1

答案 1 :(得分:4)

您可以像这样构建委托:

let m2 = m1.Map (Func<_, _> f1)

F#在某些情况下隐式构造委托,如问题中的lambda所示,但它并不总是无缝的。有关其他信息,请参阅the MSDN page for delegates in F#