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))