Generics F#来自对象而非类型的泛型类型实例

Generics F#来自对象而非类型的泛型类型实例,generics,f#,Generics,F#,假设我们有下面的类型,它暂时不起任何作用 type Foo<'a,'b> = new () = {} 但是它说没有定义类型键入,而不是先选择类型。 我怎样才能做到像let second=new Foo() 编辑: 更多关于我的目标的详细信息: 假设我们在通道通道上有一个通信协议。通信协议使用如下映射定义: [(currentState:Int , nextState:Int , type:string , label:string) -> realType:Type

假设我们有下面的类型,它暂时不起任何作用

type Foo<'a,'b> = 
   new () = {}
但是它说没有定义类型
键入
,而不是先选择类型
。
我怎样才能做到像
let second=new Foo()

编辑: 更多关于我的目标的详细信息: 假设我们在通道
通道
上有一个通信协议。通信协议使用如下映射定义:

[(currentState:Int , nextState:Int , type:string , label:string) -> realType:Type ]
比如说

[(currentState:1 , nextState:2 , type:"send" , label:"hello()") -> realType:Hello ;
  (currentState:2 , nextState:3 , type:"receive" , label:"bye()") -> realType:Bye]
我希望从中生成以下函数

send(a:Hello)
receive(a:Bye)
但是,正如您在地图中看到的那样,
receive(a:Bye)
不能在
send(a:Hello)
之前完成,否则编译时会出现错误。它应该遵循正确的顺序。这就是为什么要这样做的原因,我希望将一种类型receiveType实例化为
send(a:Hello)
函数的返回值,该函数允许我以以下方式使用
receive(a:Bye)

channel.send(Hello()).receive(Bye())
最后一件事是映射可以有比这2个更多的状态,长度取决于我使用的协议。整个想法将在一个类型提供程序中实现,这样我就可以提供我刚才用intelliSense描述的类型和方法


相关问题:

可以在运行时使用方法
GetGenericTypeDefinition
MakeGenericType
实例化类型参数不同于现有对象的泛型类型实例

所以,举个例子:

type Foo<'a,'b> = 
    new () = {}

type First = class end

let first = new Foo<First,First>()
  • 使用适当的类型参数创建新的泛型类型:

    let genericFooType = first.GetType().GetGenericTypeDefinition()
    
    let secondType = genericFooType.MakeGenericType(first.GetType(), typeof<First>)
    

    你不能那样做。在不知道静态类型参数是什么的情况下,如何使用这样的类型?我想我会在类型提供程序中使用它。我还认为它可能用于类型提供程序,而类型提供程序是在脚本中使用它时编译的。这意味着已经以某种方式定义了类型。但是现在我考虑一下,我将给类型提供程序一个参数,然后从参数创建这些类型,所以这是不可能的。但是这种代码只能在动态类型语言中完成,这和python一样正确吗?这里的类型参数是什么意思?类型参数是指定义
    Foo
    实例时为
    'a
    'b'
    提供的类型。您必须先为这两种类型静态声明一个类型,即
    新Foo
    。但是
    first.GetType()
    返回一个在运行时表示类型的对象。Python不能表示这种关系,因为Python根本没有类型,但是很难知道您试图用这个例子做什么。您是在尝试编写类型提供程序,还是只需要一个泛型数据类型?您不能直接这样做,因为类型需要在编译时已知,以便验证程序的正确性。你知道,静态输入的全部意义。但您可能会通过一些创造性的元编程得以逃脱:这不是为通信协议构建API的方式。这里有一个建议:首先尝试在没有类型提供程序的情况下手动编写(部分)协议,然后查看其中的一些类型是否适合自动生成。别想当锤子。
    type Foo<'a,'b> = 
        new () = {}
    
    type First = class end
    
    let first = new Foo<First,First>()
    
    let genericFooType = first.GetType().GetGenericTypeDefinition()
    
    let secondType = genericFooType.MakeGenericType(first.GetType(), typeof<First>)
    
    let second = secondType.GetConstructor([||]).Invoke([||])
    
    second.GetType() = typeof<Foo<Foo<First,First>, First>> // True
    
    let originalTypeArguments = first.GetType().GenericTypeArguments
    
    // Prints [|"First"; "First"|]
    printfn "%A" (originalTypeArguments |> Array.map (fun x -> x.Name))