Matrix 如何在实现中缀运算符时避免循环依赖关系

Matrix 如何在实现中缀运算符时避免循环依赖关系,matrix,vector,f#,operators,static-methods,Matrix,Vector,F#,Operators,Static Methods,假设我希望在F#中实现一个向量和一个矩阵类。该语言不允许循环依赖,因此我不能让Vector类引用Matrix类,反之亦然。让我们进一步说,我做出的选择是,两个类都不应该依赖于另一个(与向量依赖于矩阵而不是相反的情况相反) 现在我想实现矩阵实例与向量实例的右乘法,即a*b,其中a是矩阵,b是向量。第一个想法是将op_Multiply声明为例如矩阵类中的静态成员方法。在C#中,这意味着有一个带有如下签名的静态方法 public static Vector operator *(Matrix matr

假设我希望在F#中实现一个向量和一个矩阵类。该语言不允许循环依赖,因此我不能让Vector类引用Matrix类,反之亦然。让我们进一步说,我做出的选择是,两个类都不应该依赖于另一个(与向量依赖于矩阵而不是相反的情况相反)

现在我想实现矩阵实例与向量实例的右乘法,即a*b,其中a是矩阵,b是向量。第一个想法是将op_Multiply声明为例如矩阵类中的静态成员方法。在C#中,这意味着有一个带有如下签名的静态方法

public static Vector operator *(Matrix matrix, Vector vector);
例如,矩阵类。但是,此操作同时依赖于向量类和矩阵类,因此不能在矩阵或向量类中声明,因为它们不允许相互依赖

下一个想法可能是将其声明为某种扩展方法,在F#中,大意是:

[<Extension>]
static member (*) (matrix : IMatrix, vector : IVector) =
    ...
而不是

a * b

从某种意义上说,这里的问题是我不能编写“运算符扩展方法”。如何定义乘法方法,以避免矩阵和向量相互依赖,同时实现编写类似于“a*b”的内容的能力?

我认为您可以在具有
[]
属性的模块中编写作为
let
绑定函数的运算符:

module Foo =
    type Bar = Bar of string

module Ploeh =
    type Fnaah = Fnaah of string

[<AutoOpen>]
module Operators =
    let (+) (Foo.Bar b) (Ploeh.Fnaah f) = b + f

open Foo
open Ploeh

let sum = (Bar "sgryt") + (Fnaah "ler")
这不是我经常做的事情,所以我不能说是否有一些极端情况会使这项工作在实践中变得不那么理想……

首先,F#允许在小范围内循环依赖。如果选择,您完全可以使
向量
矩阵
相互引用。其次,要在以前定义的类型上定义运算符,请将其设置为独立函数,而不是类方法。
module Foo =
    type Bar = Bar of string

module Ploeh =
    type Fnaah = Fnaah of string

[<AutoOpen>]
module Operators =
    let (+) (Foo.Bar b) (Ploeh.Fnaah f) = b + f

open Foo
open Ploeh

let sum = (Bar "sgryt") + (Fnaah "ler")
> let sum = (Bar "sgryt") + (Fnaah "ler");;    
val sum : string = "sgrytler"