2013-11-13 6 views
1

У меня есть следующее определение класса для общего фильтра. В соответствии с функциональными принципами, я хотел бы иметь функцию, которая обновляет фильтр и возвращает новый объект типа фильтра. Это позволит мне работать обновление без разрешения на изменчивостьпереопределение сигнатуры типа из абстрактного класса

[<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>, но я ошибаюсь.

Как я могу решить эту проблему? Спасибо!

ответ

3

F # не использует/не конвертирует/не принуждает (хотя flexible types существует). Вы должны бросить его в явном виде:

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

Примечания :> оператора: это он так называемый статический бросок и выполняются во время компиляции.

UPDATE

Это может быть даже проще, как это было предложено в комментариях new LKF(newx, A, P, Q, R, H) :> _

+0

Спасибо. Как бы вы использовали гибкие типы в этом случае? Я попытался: 'abstract member Update: 'a -> #Filter <'T, 'a>', но это проблема. не так, как это работает. – NoIdeaHowToFixThis

+2

@EugeneFotin Я не рядом с компьютером, но не будет ':> _' также работать в этом случае? –

+1

@Ramon: yes, ':> _' также работает. – NoIdeaHowToFixThis

Смежные вопросы