首页 > 解决方案 > 如何在 SRTP 类中覆盖 ToString()

问题描述

我在创建一个通用数学类时遇到问题(这里是一个非常小的示例代码,一个类型为 Vector 的类),但是,它的值不限于一个单一的数值数据类型,而是^F用作静态解析类型参数,我期望它是用户用来实例化类的任何东西,例如intbut 也BigRationalor 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 也是如此,我相信我可以以同样的方式修复它)。

这真的可能吗?

提前谢谢了!

标签: f#

解决方案


  • 不要用类型参数注释算术运算符的参数,它们会被推断出来的
  • 将算术运算符的参数作为元组传递
  • 在算术运算符的实现中关闭括号
  • 用属性替换let-bound 值values
输入向量<'F> (_values : 'F[]) =
    成员 val 值 = _values
    成员内联 me.Dimension = Array.length me.Values
    成员内联 me.Item 与 get i = me.Values.[i + 1]
    静态成员内联 ( * ) (a: Vector<_>, scalar) =
        Vector<_>(Array.init (a.Dimension) (fun i -> a.Values.[i] * scalar))
    覆盖 me.ToString() = "{" + (me.Values.ToString()) + "}"

推荐阅读