ベクトルを操作するために、F# でジェネリック関数と型を書きたいと思います。(+)
静的演算子と演算子を使用した複数の異なるデータ型が(*)
あるため、それらを追加してスカラー (float
今のところ s ) で乗算できます。
たとえば、Vec2
私が書くことができるクラスを構築することに成功しました
let v = 3.0 * Vec2(1.,1.) + Vec2(3.,4.)
Vec3
または他のタイプのベクトルも持っているとしましょう。以下は、私が書きたいものの 2 つの例 (疑似コード) です。
ベクトルの汎用関数
'V
これは、(+)
andをアサートする静的に解決された型制約で可能だと思いますが、(*)
機能させることはできません。次のように型制約に名前を付けることができればいいと思います。
let average<'V when 'V : vector> (v1:'V) (v2:'V) =
0.5 * (v1 + v2)
実際に機能する代替手段はありますか?
それ自体がベクトル型であるジェネリック型
任意の型'T
および'V
ベクトルを表す型について、ベクトルの'T -> 'V
ような関数を追加およびスカラー乗算できます。のような型を作りたい
type VecFunc<'T,'V when 'V : vector> = ...
簡単な例として、両方のコンポーネントが に等しい を取り、を返すf : VecFunc<int,Vec2>
関数を格納できます。メソッドを呼び出すことで、基になる関数を評価できるかもしれません。int
x
Vec2
float x
Eval
f.Eval(3) // would return Vec2(3.,3.)
VecFunc<int,Vec2>
ベクトル型として扱い、計算できるようにそれ(+)
と(*)
演算を与えたい
(-2.0 * f + f).Eval(2) // returns Vec2(-4., -4.)
またはそれを最初の例と組み合わせる:
(average f g).Eval(1) // ...
これらの結果を得るために F# インターフェイスまたは型パラメーターを使用する方法はありますか?