F#键入以组合1D和2D阵列

F#键入以组合1D和2D阵列,f#,F#,我可以拥有一个成员为float数组或类似float数组的数组的类吗 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 V

我可以拥有一个成员为float数组或类似float数组的数组的类吗

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
重写大量代码,以重复
数组
类型方法,如
.Item
等。或者,我如何定义从
继承的
类型值
[]
但将elment类型
'a
限制为
float
float[]
仅?

我不完全确定您为什么需要它,但您可以使用私有构造函数定义一个
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)

键入testaris有什么原因不能总是使用
float[][]
并在1D场景中使用
Value2D[0]
吗?我在上面用
let x=[[1.0;2.0 |];让y=new TestArr(x)进行了测试“错误”方法或对象构造函数“TESTARR <代码> 1”未找到< /代码>。谢谢。托马斯解决方案建议私人构造函数,因此您不能做新的TESTARR……相反,您需要使用ARRAY1D方法作为1D数组的示例用例。还确定这2种方法(ARRAY1D和ARARY2D)是静态的,这似乎在Tomas代码中丢失了。@Ankur-感谢您的更正-是的,最后两个方法应该是静态的,并且可以使用
TestArr.Array1D(x)
TestArr.Array2D(y)
创建对象(方法名称可以相同-例如
Create
,也可以使用重载)。