4

ベクトルを操作するために、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 xVec2float xEval

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# インターフェイスまたは型パラメーターを使用する方法はありますか?

4

1 に答える 1