我对通用过滤器有以下类定义。 根据功能原则,我想有一个更新过滤器并返回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>
,但它得到{{1相反。我认为应该没问题,因为LKF
是LKF
的子类型,但我错了。
我该如何解决这个问题? 谢谢!
答案 0 :(得分:3)
F#不会隐式转换/转换/强制(尽管存在flexible types)。你必须明确地施展它:
new LKF(newx, A, P, Q, R, H) :> Filter<_, _>
注意:>
运算符:这就是所谓的静态强制转换,它在编译时执行。
<强>更新强>
它可以更简单,如评论new LKF(newx, A, P, Q, R, H) :> _