1

我有以下通用过滤器的类定义。本着函数式的原则,我想要一个更新过滤器并返回Filter类型的新对象的函数。这将允许我在不解决可变性的情况下操作更新

[<AbstractClass>]
type Filter<'T, 'a> (filterState: 'T) =
    let FilterState = filterState
    abstract member Update: 'a -> Filter<'T, 'a>
    abstract member GetState: unit -> 'T

然后我有一个专门的实现:

type LKF (filterState: GenericMatrix, a: GenericMatrix, p: GenericMatrix, q: GenericMatrix, r: GenericMatrix, h: GenericMatrix) =
    inherit Filter<GenericMatrix, GenericMatrix> (filterState)
    let A = a
    let P = p
    let Q = q
    let R = r
    let H = h

    override this.Update(obsVector: GenericMatrix) =
        [... do calculations here] 
        new LKF(newx, A, P, Q, R, H)        

    override this.GetState() =
        filterState

问题是编译器将其标记new LKF(newx, A, P, Q, R, H)为错误,因为Filter<'T, 'a>根据抽象类中的类型签名,它期望返回值 type ,但它却得到了一个LKF。我认为应该没问题,因为它LKF是 的子类型Filter<'T, 'a>,但我错了。

我怎么解决这个问题?谢谢!

4

1 回答 1

3

F# 不会隐式强制转换/转换/强制(尽管存在灵活的类型)。你必须明确地转换它:

 new LKF(newx, A, P, Q, R, H) :> Filter<_, _>

注意:>运算符:这就是所谓的静态转换,它是在编译时执行的。

更新

正如评论中建议的那样,它可以更简单new LKF(newx, A, P, Q, R, H) :> _

于 2013-11-13T12:16:16.413 回答