この関数のようにベクトルを正規化しています:
member this.Normalize =
if this.Length > _zerotolerance then
let inv:float = 1.0 / this.Length
this.x <- this.x *= inv // overloaded
this.y <- this.y *= inv // overloaded
ただし、浮動小数点数の乗算代入演算子 *= はデフォルトでは使用できないため、作成する必要がありました。
MSDN http://msdn.microsoft.com/en-us/library/dd233204%28v=vs.110%29によると、次の方法で演算子をオーバーロードする必要があります。
static member ( *= ) (arg1 : type, arg1: type) = ...code etc...
そのため、次のように、F# コードファイルで乗算代入のために次の演算子をオーバーロードしました。
// Operator
static member ( *= ) ( v1:vector2, v2:vector2 ) =
v1.x <- v1.x + v1.x * v2.x
v1.y <- v1.y + v1.y * v2.y
static member ( *= ) ( v1:vector2, v2:float ) =
v1.x <- v1.x + v1.x * v2
v1.y <- v1.y + v1.y * v2
// Operator
static member ( *= ) ( f1:float, f2:float ) =
f1 <- f1 + f1 * f2
そして、それはうまくいかないようです。演算子をオーバーロードした後でも、次の問題があります。
vector2.fs(107,36): エラー FS0001: タイプ 'float' は '*=' という名前の演算子をサポートしていません
そのため、演算子 *= はフロートに対して機能しません。ここで失敗しています(正規化機能):
this.X <- this.X *= inv
演算子の他のオーバーロードを確認するために、Vector2 のテスト関数を一時的に作成しました。
member this.MultiplyAssignmentTest_1(v1:vector2,v2:vector2):vector2 = v1 *= v2
member this.MultiplyAssignmentTest_2(v1:vector2,v2:float):vector2 = v1 *= v2
オペレーターはVector *= VectorとVector *= Floatの両方のテストに合格しましたが、 Float *= Float を実行しようとすると引き続き失敗します
3 番目のテスト関数 - float *= float : まったく同じエラーで完全に失敗します。
member this.MultiplyAssignmentTest_3(v1:float,v2:float):float = v1 *= v2
OFC 私はいつでも と書くことができますがthis.X <- This.X + This.X *= inv
、短い数式には問題ありません。しかし、これを使って多くのベクトル化された数学を書き始めると、それはあまり経済的ではありません。
私は何を台無しにしましたか?なんらかの方法でオーバーロードを本当に台無しにしたのでしょうか、それとも私が知らないバグがありますか?
Vector2 *= Float では機能するのに、Float *= Floatでは機能しないのはなぜですか?
それとも、自分では気付いていないタイプミス/大文字小文字のエラーがあるのでしょうか?