向DenseVector类型添加扩展时出现问题

时间:2016-10-01 17:05:58

标签: f# mathnet

我正在尝试向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?另外,我添加扩展方法的方法是否正确?

1 个答案:

答案 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