Как переопределить ToString () в классе SRTP - PullRequest
0 голосов
/ 29 января 2019

У меня проблемы с созданием универсального математического класса (здесь, в качестве очень маленького примера кода класса типа Vector), который, однако, не ограничивается одним единственным числовым типом данных для своих значений, а вместо этого использует ^F как статический разрешенный параметр типа , и я ожидаю, что он будет тем, что пользователь использует для создания экземпляра класса, например int, но также BigRational или MyCustomNumber, если он придерживается ограничений.

type Vector< ^F> (_values : ^F []) =
    let values = _values
    member inline __.Dimension = Array.length values
    member inline __.Item with get i = values.[i + 1]
    static member inline ( * ) (a: Vector< ^F>) (scalar: ^F) =
        Vector< ^F>(Array.init (a.Dimension) (fun i -> values.[i] * scalar)
    override inline __.ToString() = "{" + (values.ToString()) + "}" // <--- problem-line

Моя проблема с этим кодом заключается в том, что я до сих пор не знаю, как правильно переопределить метод Object.ToString() (то же самое для реализации IComparable, который, я полагаю, мог бы исправить таким же образом).

Это вообще возможно?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 29 января 2019
  • Не аннотируйте аргументы арифметического оператора параметром типа, они будут правильно выведены
  • Передайте аргументы арифметического оператора в виде кортежа
  • Закройте скобки вреализация арифметического оператора
  • Заменить значение let values на свойство
type Vector<'F> (_values : 'F[]) =
    member val Values = _values
    member inline me.Dimension = Array.length me.Values
    member inline me.Item with get i = me.Values.[i + 1]
    static member inline ( * ) (a: Vector<_>, scalar) =
        Vector<_>(Array.init (a.Dimension) (fun i -> a.Values.[i] * scalar))
    override me.ToString() = "{" + (me.Values.ToString()) + "}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...