如何将 F#(double -> double)转换为 Func<double, double>?
How can I convert an F# (double -> double) to Func<double, double>?
我正在使用 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
的文档似乎没有解决我的问题。
您可以像这样构建委托:
let m2 = m1.Map (Func<_, _> f1)
F# 在某些情况下会隐式构造委托,如问题中的 lambda 所示,但它并不总是无缝的。有关其他信息,请参阅 the MSDN page for delegates in F#。
F# 扩展(MathNet.Numerics.FSharp 包)通常提供可以处理普通 F# 函数的变体。在这种情况下,你可以这样写:
let m2 = m1 |> Matrix.map f1
我正在使用 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
的文档似乎没有解决我的问题。
您可以像这样构建委托:
let m2 = m1.Map (Func<_, _> f1)
F# 在某些情况下会隐式构造委托,如问题中的 lambda 所示,但它并不总是无缝的。有关其他信息,请参阅 the MSDN page for delegates in F#。
F# 扩展(MathNet.Numerics.FSharp 包)通常提供可以处理普通 F# 函数的变体。在这种情况下,你可以这样写:
let m2 = m1 |> Matrix.map f1