我在F#中爲矩陣類實現了切片表達式,這意味着我必須實現三個GetSlice
方法。我的問題是通過利用核心庫中的現有功能來獲得有效的方法。三種方法的簽名如下:訪問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
考慮這三項的最後一項。矩陣類有一個專用的float[,]
字段,稱爲entries
,它包含矩陣數據。最自然的實現將是這樣的:
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[,]
片表達式手動實現可能看起來像這樣
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),
這將需要16模式的情況下,因此略感不便。有沒有更容易的選擇,或許基於以某種方式訪問GetSlice
擴展方法float[,]
?
嗯,我實際上不知道在哪個模塊中找到float [,]的GetSlice擴展名,而且我無法通過「轉到定義」來看它,因爲它甚至沒有被VS2015檢測到。我只知道它存在,因爲它允許我在F#中使用切片表達式。 –