【问题标题】:How to override ToString() in an SRTP class如何在 SRTP 类中覆盖 ToString()
【发布时间】:2019-01-29 08:01:58
【问题描述】:

我在创建通用数学类时遇到问题(这里是非常小的示例代码,类型为 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,我相信我可以用同样的方法解决)。

这真的可能吗?

提前非常感谢!

【问题讨论】:

    标签: f#


    【解决方案1】:
    • 不要用类型参数注释算术运算符的参数,它们会被推断出来
    • 将算术运算符的参数作为元组传递
    • 在算术运算符的实现中关闭括号
    • let绑定值values替换为属性
    输入向量 (_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()) + "}"

    【讨论】:

    • 您好,谢谢您的回复。如果我没记错的话,'F 是一个泛型(运行时检查类型),而 ^F 是在编译时检查的。出于好奇 - 如果我不能使用它,那么 SRTP 的全部意义是什么? -- OTOH,我会尽快尝试你的建议。非常感谢! :)
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多