2011-05-29 89 views
0

我能與一個成員的類或者是浮陣列或浮陣列的陣列等F#類型結合一維和二維陣列

type testArr(data: float[],...) = 
    member x.data = data 
    member x.others = ... 
    new(data: float[][],...) = ??? 

我試圖界定 type Value = Value1D of float[] | Value2D of float[][],然後定義type testArr(data: Value,...),但然後我需要重寫大量的代碼爲type Value重複array型方法,如.Item等。或者,如何定義type Value'a[]繼承,但限制elment型'a是唯一floatfloat[]

+1

是否有任何理由你不能總是有一個'float [] []'而只是使用'Value2D [0]'爲1D場景? – Gabe 2011-05-29 02:25:07

回答

1

我不能完全肯定,爲什麼你會需要這個,但你可以定義一個TestArr類私有構造函數,並添加了兩個靜態方法來創建要允許兩種類型(float[]float[][]):

type TestArr<'T> private(data:'T[]) = 
    member x.Data = data 
    member x.Others = 42 
    static member Array1D(data:float[]) = TestArr(data) 
    static member Array2D(data:float[][]) = TestArr(data) 

總是使用一個數組數組,但Gabe在註釋中提出的1D場景只有一個元素,這聽起來像是一個更好更簡單的選擇。

+0

我用'let x = [| 1.0; 2.0 |];]測試了上面的內容。 let y = new TestArr (x);;,並得到錯誤方法或對象構造函數'TestArr'1'not found'。我做錯了什麼?謝謝。 – ahala 2011-05-29 03:57:54

+1

Tomas解決方案建議使用私有構造函數,因此您無法執行新的TestArr ...而是需要使用Array1D方法作爲您的1D數組的示例。還要確保這兩種方法(Array1D和Array2D)是靜態的,這似乎從Tomas代碼中丟失了。 – Ankur 2011-05-29 08:00:58

+0

@Ankur - 感謝您的更正 - 是的,最後兩個方法應該是靜態的,可以使用TestArr.Array1D(x)或TestArr.Array2D(y)創建對象(方法名稱可以相同 - 例如'Create' - 你也可以使用重載)。 – 2011-05-29 11:31:28