F# 如何定义运算符重载而不覆盖现有运算符

F# 如何定义运算符重载而不覆盖现有运算符,f#,F#,像(+、-、*)这样的基本运算符如何在不覆盖其现有定义的情况下重载?阅读关于这个话题的其他一些帖子,我不知道该怎么做。具体来说,我希望直接在Array2D类型上定义矩阵运算。Numerics以某种方式为其矩阵和向量类型实现了这一点,但不确定如何实现。在线性代数应用中,定义正则函数而不是使用完全模糊逻辑的运算符 type Array() = static member (+) (A : float[,], B : float[,]) = let r = A.GetLengt

像(+、-、*)这样的基本运算符如何在不覆盖其现有定义的情况下重载?阅读关于这个话题的其他一些帖子,我不知道该怎么做。具体来说,我希望直接在Array2D类型上定义矩阵运算。Numerics以某种方式为其矩阵和向量类型实现了这一点,但不确定如何实现。在线性代数应用中,定义正则函数而不是使用完全模糊逻辑的运算符

type Array() =
    static member (+) (A : float[,], B : float[,]) =
        let r = A.GetLength 0
        let c = A.GetLength 1
        let C = Array2D.create r c 0.
        for i in 0..r-1 do
            for j in 0..c-1 do
                C.[i, j] <- A.[i, j] + B.[i, j]
        C


let a1 = Array2D.create 4 4 1.
let a2 = Array2D.create 4 4 1.
let a3 = a1 + a2   // type float[,] does not support the operator '+'
let y = 2 + 3      // don't want this overridden by something like a 'let inline...'
类型数组()=
静态成员(+)(A:float[,],B:float[,])=
设r=A.GetLength为0
设c=A.GetLength为1
让C=Array2D.createrc0。
对于0..r-1中的i
对于0..c-1 do中的j

C.[i,j]MathNet.Numerics如果为自己的类型提供运算符(作为其定义的一部分),那么这样做应该不会有太多问题

您试图做的是使用扩展方法提供一个操作符-我认为目前不可能

最简单的方法是提供一个稍微不同的操作符,比如说
+。
,这样就不会有冲突,但是代码仍然很容易理解。例如,这就是OCaml在区分int运算符和float运算符时所做的工作(而F#在为自定义运算符选择符号方面给了您很大的空间)


还有其他解决方案-您可以使用一个大小写联合来包装2D数组并将运算符定义为该类型的成员,也可以使用SRTPs将运算符修补到现有类型上,并在编译时将其内联,但是这样做也会以某种方式模糊逻辑。

MathNet.Numerics如果为自己的类型提供运算符(作为其定义的一部分),那么这样做应该不会有太多问题

您试图做的是使用扩展方法提供一个操作符-我认为目前不可能

最简单的方法是提供一个稍微不同的操作符,比如说
+。
,这样就不会有冲突,但是代码仍然很容易理解。例如,这就是OCaml在区分int运算符和float运算符时所做的工作(而F#在为自定义运算符选择符号方面给了您很大的空间)

还有其他解决方案-您可以使用一个大小写联合来包装2D数组,并将运算符定义为该类型的成员,或者您可以使用SRTPs将运算符修补到现有类型上,并在编译时将其内联,但这样做也会以某种方式模糊逻辑

let inline (+.) (A: float[,]) (B: float[,]) = 
    ...

let a3 = a1 +. a2