我正在尝试向DenseVector类添加一个方法,以便能够将向量区分n次。以下似乎没有工作,因为类型推断抱怨类型Vector与DenseVector类型不兼容:
open System
open System.IO
open Deedle
open MathNet.Numerics
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.LinearAlgebra.Double
open MathNet.Numerics.Distributions
[<Extension>]
type DenseVector with
member this.diffVector (v : DenseVector) (n : int) =
let rec run (v : DenseVector) (n : int) =
match n with
| 0 -> v
| _ -> run (v.[ 1 .. v.Count-1 ] - v.[ 0 .. (v.Count-1)-1 ]) (n - 1)
run v n
上面的 v.[ 0 .. (v.Count-1)-1 ]
导致了问题。为什么它被推断为Vector而不是传递给函数的DenseVector?另外,我添加扩展方法的方法是否正确?
答案 0 :(得分:3)
您遇到问题的原因是,为GetSlice
}定义Vector<'T>
方法的extension method会返回Vector<'T>
而不是DenseVector
。因此,如果您使用切片(通过调用GetSlice
工作),您将获得一个Vector,而您上面的代码将无法按预期工作。
我不确定MathNet的内部是如何工作的,但是你可能只能通过这样的方式使你的扩展方法适用于所有Vector<'T>
:
type Vector with
member this.diffVector (v : Vector<'T>) (n : int) =
let rec run (v : Vector<'T>) (n : int) =
match n with
| 0 -> v
| _ -> run (v.[ 1 .. v.Count-1 ] - v.[ 0 .. (v.Count-1)-1 ]) (n - 1)
run v n
或者,您可以通过类似的方式安全地从Vector传播到DenseVector。这可能有效,也可能无效:
[<Extension>]
type DenseVector with
member this.diffVector (v : DenseVector) (n : int) =
let rec run (v : DenseVector) (n : int) =
match n with
| 0 -> v
| _ -> let v1 = v.[ 1 .. v.Count-1 ] :?> DenseVector
let v2 = v.[ 0 .. (v.Count-1)-1 ] :?> DenseVector
run (v1 - v2) (n - 1)
run v n