F# 带约束的泛型 type VBO'T)和'T:struct和'T:>ValueType>= ... VAO型= 静态成员创建(vboList:VBO ValueType>

F# 带约束的泛型 type VBO'T)和'T:struct和'T:>ValueType>= ... VAO型= 静态成员创建(vboList:VBO ValueType>,f#,F#,这可能吗?问题是a和b有不同的类型 列表只能包含单一类型的元素 例如,[a;a]和[b;b]一样好,但是[a;b]不是 解决这个问题的一种方法是创建一个新的类继承人,如果您有一个新的float和Vector3,它们都继承自同一个基类,并且您可以将对象向下转换为该类型。您可以做的一件事是创建一个无基参数类型,并将其用作列表的元素: val a : VBO<Vector3> val b : VBO<float> VAO.Create([a;b])// F# forces v

这可能吗?

问题是
a
b
有不同的类型

列表只能包含单一类型的元素

例如,
[a;a]
[b;b]
一样好,但是
[a;b]
不是


解决这个问题的一种方法是创建一个新的类继承人,如果您有一个新的
float
Vector3
,它们都继承自同一个基类,并且您可以将对象向下转换为该类型。

您可以做的一件事是创建一个无基参数类型,并将其用作列表的元素:

val a : VBO<Vector3>
val b : VBO<float>

VAO.Create([a;b])// F# forces vboList to be of type VBO<Vector3> list
输入VBO\u基=
班尾
键入VBO'T)和'T:struct和'T:>ValueType>=
继承VBO_库
...
VAO型=
静态成员创建(vboList:VBO_基本列表)=
...
val a:VBO
valb:VBO
创建([a;b])//a和be都自动向下转换到VBO_库

事实上,您可以调用这个基本类型
VBO
,因为.NET允许两个不同类型具有相同的名称,如果它们具有不同数量的参数。

如何为浮点创建一个基本类型?或者有可能完全删除字体?我认为这不可行。当我将VBO向上转换为VBO_库时,我会丢失有关数据的所有信息,并失去向下转换VBO_库的能力,因为我不知道它是什么类型的。我认为解决方案是为float、float32、vector3等实现一个公共接口,但我不确定如何实现。您可以在
VBO\u Base
中使用抽象方法,每个
VBO
val a : VBO<Vector3>
val b : VBO<float>

VAO.Create([a;b])// F# forces vboList to be of type VBO<Vector3> list
type VBO_Base =
    class end

type VBO<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType> = 
    inherit VBO_Base
    ...

type VAO =
    static member Create(vboList : VBO_Base list) = 
    ...

val a : VBO<Vector3>
val b : VBO<float>

VAO.Create([a;b]) // both a and be get automatically downcast to VBO_Base