如何在SRTP类中重写ToString()

时间:2019-01-28 23:32:10

标签: f#

我在创建通用数学类(这里是一个非常小的示例代码,是Vector类型的类)时遇到了问题,但是,它的值不仅限于单一数值数据类型,而是使用^F作为静态解析类型参数,并且我希望它成为用户用来实例化类的内容,例如int以及BigRationalMyCustomNumber,例如只要遵守约束。

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 :(得分:3)

  • 请勿使用类型参数注释算术运算符的参数,否则会推断出它们
  • 将算术运算符的参数作为元组传递
  • 在算术运算符的实现中关闭括号
  • 用属性替换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()) + "}"