F#で小さな行列ライブラリ(主にラッパーメソッド)を作成していますが、静的演算子メソッドのオーバーロードに関する問題があります。オーバーロードされた静的演算子の使用方法
[<AutoOpen>]
module MatrixOps =
let (*) (matrix : IMatrix) (vector : IVector) =
(...)
これは私が、例えばのようなものを書くことができます:
私は、ベクトルと行列の右乗算を定義したモジュールを持っていますA * vここで、AはIMatrixであり、vはIVectorである。しかし、私は今、上記のレットバインディングの下に次の行を追加します:F#コンパイラはこれをエラーとして識別します。 "1.0"をホバリングすると、次のようになります。 "タイプ 'float'はタイプ 'IMatrix'と互換性がありません。同様に、2.0以上にホバリングすると、"タイプ 'float' IVector '"ここで起こっていることは、F#コンパイラがfloatに乗算演算子を適用せず、代わりにIMatrixとIVectorの演算子を適用しているようです。私が代わりに
let z = (1.0 : float) * (2.0 : float)
を記述する場合の問題は解消されないので、明示的な型annotionsを追加することは助けにはなりません。上記で定義したIMatrix/IVector演算子の代わりに、F#が浮動乗算演算子を選択するようにするにはどうすればよいですか?
オーバーロードをオブジェクトの1つのタイプの静的メンバーにしたい場合は、希望どおりに動作します。 –
大丈夫です。しかし、別の方法がありますか?乗算方法がIMatrixまたはIVectorのいずれかのインターフェイスにある場合は、不要な依存関係を導入することになります。 –
これは依存関係ではありません。とにかくタイプが必要です –