FSharpx は F# 向けのライブラリー群で, FSharpx.TypeProviders.Math はその 1 つです。これを使うと簡単に のベクトルの型を定義できます[A]。
open FSharpx type Vector2D = Vector<"X", "Y"> // 2 次元ベクトル type Vector3D = Vector<"X", "Y", "Z"> // 3 次元ベクトル let u = Vector2D(1.0, 2.0) let v = Vector2D(-1.0, 3.0) let w = Vector3D(1.0, 0.0, -2.0)
ここで定義した Vector2D
と Vector3D
はそれぞれ 2 次元ベクトル, 3 次元ベクトルを表します。型プロバイダーを使用して作成された型で, Vector2D
と Vector3D
は演算の互換性がありません。つまり,例えば加算は Vector2D
同士では可能ですが, Vector2D
と Vector3D
ではコンパイルエラーになります。
// OK let x = u.Add (v) // compilation error // let y = u.Add (w)
また,型の定義の際に与えた文字列はプロパティになるので,例えば上の例で u
の 1 次元目の要素は u.X
のように取得することができます。
とても便利に見えますが,残念ながら,この型プロバイダーによって作成されるベクトル型は加算やドット積くらいしか定義されていないので,常用に耐えうるものではありません。しかしこのアイディアは非常に便利で, 2 次元と 3 次元のベクトルの型をそれぞれ定義するのに同じ定義を何度も書く必要がなくなります。
コンパイル時に次元の整合性を確認できるというのはとても良いですね。行列もコンパイル時に次元の整合性をチェックしてくれると良いのですが, 2 行列間で基本演算が行えるかどうかの判定は型の一致から行えるとは限らないので (例えば積),難しそうですね。
脚注
- ただし, 7 次元まで。 [↩]