F# 如何在SRTP类中重写ToString()

F# 如何在SRTP类中重写ToString(),f#,F#,我在创建一个通用数学类(这里是一个非常小的示例代码类型向量类)时遇到问题,但是,该类的值不限于一个单一的数值数据类型,而是使用^F作为静态解析类型参数,我希望它是用户用于实例化该类的任何类型,例如int,但也包括BigRational或MyCustomNumber,只要它遵守约束 type Vector< ^F> (_values : ^F []) = let values = _values member inline __.Dimension = Array.le

我在创建一个通用数学类(这里是一个非常小的示例代码类型向量类)时遇到问题,但是,该类的值不限于一个单一的数值数据类型,而是使用
^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
类型向量<^F>(\u值:^F[]=
让值=_值
成员内联尺寸=数组长度值
具有get i=值的成员内联项[i+1]
静态成员内联(*)(a:向量<^F>)(标量:^F)=
向量<^F>(Array.init(a.Dimension)(趣味i->values.[i]*标量)
重写内联u u.ToString()=“{”+(values.ToString())+“}”//
  • 不要用类型参数注释算术运算符的参数,它们将被正确推断
  • 将算术运算符的参数作为元组传递
  • 在算术运算符的实现中关闭括号
  • 用属性替换
    let
    绑定值
    values
类型向量a.Values。[i]*标量) 重写me.ToString()=“{”+(me.Values.ToString())+“}”
嘿,谢谢你的回复。如果我没有弄错的话,
'F
是一种泛型(运行时检查的类型),与编译时检查的
^F
相反。出于好奇-如果我不能使用SRTP,那么SRTP的全部意义是什么奥托,我会尽快尝试你的建议。非常感谢!:) 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()) + "}"