У меня есть следующее определение класса для общего фильтра. В соответствии с функциональными принципами, я хотел бы иметь функцию, которая обновляет фильтр и возвращает новый объект типа фильтра. Это позволит мне работать обновление без разрешения на изменчивостьпереопределение сигнатуры типа из абстрактного класса
[<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>
, в соответствии с типом подписи в абстрактном классе, но вместо этого он получает LKF
. Я думал, что все должно быть хорошо, потому что LKF
является подтипом Filter<'T, 'a>
, но я ошибаюсь.
Как я могу решить эту проблему? Спасибо!
Спасибо. Как бы вы использовали гибкие типы в этом случае? Я попытался: 'abstract member Update: 'a -> #Filter <'T, 'a>', но это проблема. не так, как это работает. – NoIdeaHowToFixThis
@EugeneFotin Я не рядом с компьютером, но не будет ':> _' также работать в этом случае? –
@Ramon: yes, ':> _' также работает. – NoIdeaHowToFixThis