私は、デカルト積と行列乗算用に独自の演算子を定義する道を歩み始めています。
リストとしてエイリアス化された行列とベクトルを使用:
type Matrix = float list list
type Vector = float list
次のように書くことで、独自の初期化コードを書くことができます (そしてデカルト積を掘り出し物にすることができます)。
let inline (*) X Y =
X |> List.collect (fun x -> Y |> List.map (fun y -> (x, y)))
let createVector size f =
[0..size - 1] |> List.map (fun i -> f i)
let createMatrix rows columns f =
[0..rows - 1] * [0..columns - 1] |> List.map (fun i j -> f i j)
ここまでは順調ですね。問題は、*
私のバージョンが独自の乗算演算子を持たないリストに対してのみ定義されているにもかかわらず、私の定義が通常の定義を一掃することです。
ドキュメントhttp://msdn.microsoft.com/en-us/library/vstudio/dd233204.aspxには、「新しく定義された演算子は組み込み演算子よりも優先される」と記載されています。しかし、私はすべての数値の化身が一掃されるとは思っていませんでした.静的型付けがこれを処理するのでしょうか?
*
MathNet Numerics は行列の乗算に使用するため、型を尊重するグローバル演算子を定義できることはわかっています。また、その道をたどりたいと思います。そのためには、型のデカルト積Matrix
(それ自体がリスト) よりも行列の乗算を優先する型システムが必要になります。
F#でこれを行う方法を知っている人はいますか?