F#でマトリックスクラスのスライス式を実装しています。つまり、3つのGetSlice
メソッドを実装する必要があります。私の質問は、コアライブラリの既存の機能を活用することでこれを行う効率的な方法を得ることです。 3つの方法の署名は次のとおりです。F#でのGetSliceメソッドへのアクセス
member GetSlice : idx1:int * start2:int option * end2:int option -> IMatrix
member GetSlice : start1:int option * end1:int option * idx2:int -> IMatrix
member GetSlice : start1:int option * end1:int option *
start2:int option * end2:int option -> IMatrix
これら3つの方法の署名について考えてみましょう。マトリックスクラスにはentries
と呼ばれる専用のfloat[,]
フィールドがあり、マトリックスデータを保持します。
member this.GetSlice (?start1 : int, ?end1 : int, ?start2 : int, ?end2 : int) =
let newEntries = entries.GetSlice(?start1 = start1, ?end1 = end1,
?start2 = start2, ?end2 = end2)
new Matrix(newEntries),
単にfloat[,]
実装のGetSlice
機能を使用しています。最も自然な実装では、このようなものになるだろう。しかし、GetSlice
拡張メソッドは利用できません(少なくともオープンした名前空間では使用できません)ので、これはコンパイルされません。私はこの方法がFSharp.Coreでデフォルトで利用可能であると思っていたでしょうが、これは実際そうではありません。 float[,]
ためのスライス表現に基づいて、マニュアル実装では、16パターンの例を必要とし、これ多少不便であるだろう。この
member this.GetSlice (?start1 : int, ?end1 : int, ?start2 : int, ?end2 : int) =
let newEntries = match (start1, end1, start2, end2) with
| Some(sta1), Some(end1), Some(sta2), Some(end2) -> entries.[sta1 .. end1, sta2 .. end2]
| Some(sta1), Some(end1), Some(sta2), None -> entries.[sta1 .. end1, sta2 .. ]
(...)
new Matrix(entries),
のようになります。より簡単なオプションはありますか?おそらくGetSlice
拡張メソッドfloat[,]
へのアクセスを何らかの方法で得ることに基づいていますか?
まあ、私は実際にどのモジュールでfloat [、]のGetSlice拡張子を見つけるのかわかりませんし、VS2015でも検出されないので "Go to definition"で見ることができません。 F#でスライス式を使用できるので、それが存在することがわかります。 –