2011-05-29 45 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