具有非泛型构造函数的泛型F#类型

时间:2011-04-23 20:12:40

标签: generics f#

是否有某种方法可以使用无参数构造函数创建非泛型实例的泛型类型?非编译示例:

type Child<'T>() = class end

type Parent<'T>(c:Child<'T>) =
   new() = Parent(Child<unit>()) // ERROR: This code is less generic than required by 
                                 // its annotations because the explicit type variable
                                 // 'T' could not be generalized. It was constrained to be 'unit'.

我想要一个非泛型值,以避免价值限制,也因为我想使用'T进行重载(例如Parent<int>Parent<bool>上的重载等。)

我认为这可能是不可能的,我需要找到一种不同的方式来模拟事物。但也许有人有想法?

2 个答案:

答案 0 :(得分:3)

你想要什么是不可能的 - 当调用泛型对象的构造函数时,调用者总是可以指定他想要的任何类型参数。这类似于调用静态方法 - 调用者总是可以指定类型:

let a = new Parent<Foo>()
let b = Parent<Foo>.Bar

类型Parent<'T>中的构造函数始终返回类型Parent<'T>的值,因此您无法避免使用类型'T作为类型签名的一部分。但是,静态方法可以具有不同的返回类型。

也许您可以使用静态方法而不是构造函数?

type Child<'T>() = class end
type Parent<'T>(c:Child<'T>) =
    static member New() = Parent(Child<unit>())

然后你可以写:

let a = Parent.New()
let b = Parent<Foo>.New() // You can specify type parameter, but it is ignored, 
                          // because return type is always 'Parent<unit>'

答案 1 :(得分:1)

老实说,我认为你真的在寻找一个可选参数。

type Parent<'T>(?c:Child<'T>) = class 

    end

当然这需要他们指定类型但是那么糟糕?

let p = Parent<int>()